ประเภทสำหรับวันที่เท่านั้นใน C # - เหตุใดจึงไม่มีประเภทวันที่


108

ในโครงการ C # ของเราเราจำเป็นต้องแสดงวันที่โดยไม่มีเวลา ฉันรู้ถึงการมีอยู่ของ DateTime อย่างไรก็ตามมันรวมช่วงเวลาของวันด้วย ฉันต้องการบอกให้ชัดเจนว่าตัวแปรบางตัวและอาร์กิวเมนต์เมธอดนั้นอิงตามวันที่ ดังนั้นฉันจึงไม่สามารถใช้DateTime.Dateทรัพย์สินได้

อะไรคือแนวทางมาตรฐานสำหรับปัญหานี้? ฉันไม่ใช่คนแรกที่เจอสิ่งนี้แน่ ๆ ? ทำไมไม่มีDateคลาสใน C #?

ใครบ้างที่มีการใช้งานที่ดีโดยใช้โครงสร้างและวิธีการส่วนขยายบางอย่างใน DateTime และอาจใช้ตัวดำเนินการบางอย่างเช่น == และ <,>?


1
ในขณะที่ฉันเข้าใจว่าต้องการความหมายที่ชัดเจนและชัดเจน แต่ปัญหาเฉพาะใดที่DateTimeสร้างขึ้น
Jeff Sternal

15
1 ฉันต้องจำไว้ว่าให้ลบชั่วโมงเมื่อเริ่มต้นวิธีการ 2 มันไม่ได้สื่อสารให้ดีว่ามันใช้งานได้ในวันที่เท่านั้น สิ่งนี้สำคัญเช่นเมื่อจัดเก็บและโหลดจาก Db ซึ่งประเภทแคบจะเพียงพอ การเขียนโปรแกรมคือการมีส่วนร่วมสำหรับคนที่ไม่ใช่คอมพิวเตอร์
Carlo V. Dango

6
ฉันแค่อยากจะบอกว่าการไม่มีคลาสวันที่เป็นเรื่องใหญ่และการใช้ DateTime ไม่ดีเลย ทันทีที่คุณจัดเก็บ "วันที่" ของคุณเป็นวันที่ - เวลาคุณจะเป็นตัวประกันสำหรับปัญหาการประหยัดพื้นที่ / เขตเวลา การทิ้งช่วงเวลาอาจส่งวันที่ทั้งหมดของคุณย้อนกลับไปในวันที่นาฬิกาเปลี่ยนไป (!) และผู้ใช้ในเขตเวลาที่ต่างกันจะเห็นวันที่ที่แตกต่างกันเมื่อพยายามแปลงวันที่ - เวลา วันที่ - เวลาเป็นสิ่งที่ดีในการแสดงช่วงเวลาที่แม่นยำในช่วงเวลา (ระยะเวลาสั้น ๆ จากจุดใดจุดหนึ่งหรืออะไรก็ตาม) แต่ไม่เหมาะอย่างยิ่งสำหรับการแสดงวันที่เป็นนามธรรม
TheMathemagician

3
คำถามที่คล้ายกันในภายหลัง stackoverflow.com/questions/7167710/…และ Jon Skeet บอกว่าควรมีวันที่
goodeye

9
ชนิดข้อมูลวันที่เท่านั้นคือ DateTime เนื่องจากชนิดข้อมูลจำนวนเต็มเป็นทศนิยม ผู้ที่โต้แย้งว่าเราไม่ต้องการวันที่เพราะคุณสามารถทิ้งช่วงเวลานั้นไปได้คล้ายกับการบอกว่าเราไม่ต้องการจำนวนเต็มเนื่องจากเราสามารถทิ้งส่วนทศนิยมได้ โลกของเรามีแนวคิดเกี่ยวกับวันที่ที่ไม่รวมเวลา 5 มีนาคมไม่ใช่ 5 มีนาคม 00:00:00 น.
คลุมเครือ

คำตอบ:


55

อนุญาตให้ฉันเพิ่มอัปเดตสำหรับคำถามคลาสสิกนี้:

  • จอนสกีตของโนดะเวลาLocalDateห้องสมุดอยู่ในขณะนี้ค่อนข้างเป็นผู้ใหญ่และมีวันเดียวชนิดที่เรียกว่า (Local ในกรณีนี้หมายถึงเฉพาะในพื้นที่สำหรับใครบางคนเท่านั้นไม่จำเป็นต้องอยู่ในเครื่องคอมพิวเตอร์ที่รหัสกำลังทำงานอยู่)

  • ชนิดวันที่เท่านั้นที่เรียกว่าDateเป็นส่วนเสริมที่เสนอให้กับ. NET Core ผ่านโครงการcorefxlab คุณจะพบสิ่งนี้ในSystem.Timeแพ็กเกจพร้อมTimeOfDayประเภทและวิธีการขยายหลายวิธีสำหรับประเภทที่มีอยู่

ฉันได้ศึกษาปัญหานี้แล้วอย่างมีนัยสำคัญดังนั้นฉันจะแบ่งปันเหตุผลหลายประการสำหรับความจำเป็นของประเภทเหล่านี้

  1. มีความคลาดเคลื่อนทางตรรกะระหว่างค่าวันที่เท่านั้นและค่าวันที่ตอนเที่ยงคืน

    • ไม่ใช่ทุกวันท้องถิ่นจะมีเวลาเที่ยงคืนในทุกเขตเวลา ตัวอย่าง: การเปลี่ยนเวลาตามฤดูกาลในฤดูใบไม้ผลิไปข้างหน้าของบราซิลจะเลื่อนนาฬิกาจาก 11:59:59 น. เป็น 01:00:00 น.

    • วันที่ - เวลามักหมายถึงเวลาที่เฉพาะเจาะจงภายในวันในขณะที่วันที่เท่านั้นอาจหมายถึงจุดเริ่มต้นของวันจุดสิ้นสุดของวันหรือช่วงทั้งหมดของวัน

  2. การแนบเวลากับวันที่อาจทำให้วันที่เปลี่ยนไปเมื่อค่าถูกส่งผ่านจากสภาพแวดล้อมหนึ่งไปยังอีกสภาพแวดล้อมหนึ่งหากไม่ได้ดูโซนเวลาอย่างระมัดระวัง สิ่งนี้มักเกิดขึ้นใน JavaScript (ซึ่งDateอ็อบเจ็กต์คือวันที่ + เวลาจริงๆ) แต่สามารถเกิดขึ้นได้อย่างง่ายดายใน. NET ด้วยหรือในการทำให้เป็นอนุกรมเมื่อข้อมูลถูกส่งผ่านระหว่าง JavaScript และ. NET

  3. การทำให้เป็นอนุกรมDateTimeกับ XML หรือ JSON (และอื่น ๆ ) จะรวมเวลาไว้เสมอแม้ว่าจะไม่สำคัญก็ตาม สิ่งนี้สับสนมากโดยเฉพาะอย่างยิ่งเมื่อพิจารณาถึงสิ่งต่างๆเช่นวันเกิดและวันครบรอบซึ่งเวลาไม่เกี่ยวข้องกัน

  4. ในทางสถาปัตยกรรมDateTimeเป็นวัตถุมูลค่าDDD แต่ละเมิดหลักการความรับผิดชอบเดียวในหลายวิธี:

    • ได้รับการออกแบบเป็นประเภทวันที่ + เวลา แต่มักใช้เป็นวันที่เท่านั้น (โดยไม่สนใจเวลา) หรือเวลาของวันเท่านั้น (โดยไม่สนใจวันที่) ( TimeSpanมักใช้เป็นช่วงเวลาของวัน แต่เป็นอีกหัวข้อหนึ่ง)

    • DateTimeKindค่าติดอยู่กับ.Kindสถานที่ให้บริการแยกชนิดเดียวเป็นสาม, The Unspecifiedชนิดคือจริงๆเจตนาเดิมของโครงสร้างและควรจะใช้วิธีการที่ Utcชนิดสอดคล้องค่าเฉพาะกับ UTC และLocalสอดคล้องชนิดคุ้มค่ากับโซนเวลาท้องถิ่นของสภาพแวดล้อม

      ปัญหาในการมีแฟล็กแยกต่างหากสำหรับชนิดคือทุกครั้งที่คุณใช้ a DateTimeคุณควรตรวจสอบ.Kindเพื่อตัดสินใจว่าจะใช้พฤติกรรมใด วิธีการของกรอบทำทั้งหมดนี้ แต่คนอื่นมักลืม นี่เป็นการละเมิด SRP อย่างแท้จริงเนื่องจากประเภทนี้มีเหตุผลสองประการในการเปลี่ยนแปลง (ค่าและชนิด)

    • ทั้งสองอย่างนี้นำไปสู่การใช้ API ที่รวบรวม แต่มักเป็นเรื่องไร้สาระหรือมีกรณีขอบแปลก ๆ ที่เกิดจากผลข้างเคียง พิจารณา:

      // nonsensical, caused by mixing types
      DateTime dt = DateTime.Today - TimeSpan.FromHours(3);  // when on today??
      
      // strange edge cases, caused by impact of Kind
      var london = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
      var paris = TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time");
      var dt = new DateTime(2016, 3, 27, 2, 0, 0);  // unspecified kind
      var delta = paris.GetUtcOffset(dt) - london.GetUtcOffset(dt);  // side effect!
      Console.WriteLine(delta.TotalHours); // 0, when should be 1 !!!

โดยสรุปในขณะที่ a DateTime สามารถใช้สำหรับวันที่เท่านั้น แต่ควรทำก็ต่อเมื่อทุกสถานที่ที่ใช้มันระมัดระวังอย่างยิ่งที่จะละเลยเวลาและระมัดระวังอย่างยิ่งที่จะไม่พยายามแปลงเป็นและจาก UTC หรืออื่น ๆ โซนเวลา.


2
หากSystem.Time.Dateจะจบลงในกรอบ. NET: /
Robert Jørgensgaard Engdahl

1
คุณสามารถใช้ได้วันนี้เพียงสมัครรับฟีด corefx myget และคุณสามารถดึงเข้ามาได้System.Timeเช่นเดียวกับแพ็คเกจอื่น ๆ มันยังไม่ "เป็นทางการ"
Matt Johnson-Pint

16

ฉันสงสัยว่าไม่มีDateคลาสบริสุทธิ์ที่อุทิศให้เพราะคุณมีDateTimeที่สามารถจัดการได้แล้ว มีDateจะนำไปสู่การทำสำเนาและความสับสน

หากคุณต้องการให้แนวทางมาตรฐานดูDateTime.Dateคุณสมบัติที่ให้เฉพาะส่วนวันที่ของ a DateTimeโดยมีค่าเวลาเป็น 12:00:00 เที่ยงคืน (00:00:00 น.)


61
ข้อได้เปรียบที่สำคัญของคลาส Date โดยเฉพาะคือไม่ต้องทนทุกข์ทรมานจากความซับซ้อนของเขตเวลาและเวลาออมแสง
Dimitri C.

3
@DimitriC. ฉันไม่เห็นด้วย - คุณสามารถใช้ DateTime กับ UTC ได้และคุณไม่ต้องทนทุกข์ทรมานจากปัญหาที่อธิบายรวมทั้ง DateTime แม้ว่าคุณต้องการเพียงวันที่คุณก็ยังสามารถทำคณิตศาสตร์ที่เกี่ยวข้องกับเวลาได้ (เช่นบอกวันที่ถ้าฉันลบ 20 x 2 ชั่วโมง จากวันนี้).
Robert MacLean

10
การต้องคิดเกี่ยวกับ UTC และอะไรก็ตามที่เกี่ยวข้องกับเขตเวลาเป็นเพียงการสิ้นเปลืองพลังงานเพราะสามารถหลีกเลี่ยงได้อย่างง่ายดายโดยคลาส Date แยกต่างหาก และฉันไม่เห็นความสับสนระหว่าง Date และ DateTime
maulik13

6
เห็นด้วยว่า C # ควรมีคลาส Date จริงๆ ไม่เพียง แต่การแปลงเขตเวลาจะเป็นแหล่งที่มาของข้อบกพร่องของเรือดำน้ำอย่างต่อเนื่อง แต่มันเป็นเพียงความเจ็บปวดอย่างชัดเจนเมื่อต้องจัดการกับสิ่งต่าง ๆ ในวันทำการมากกว่าตามเวลา
Julian Birch

1
@RobertMacLean: มันไม่มีเหตุผลที่จะพิจารณา "วันที่ถ้าฉันลบ 20 x 2 ชั่วโมงจากวันนี้" ในตัวอย่างนี้คุณถือว่าวันนี้เป็น "วันนี้ตอนเที่ยงคืน" หรือไม่ "วันนี้ตอนเที่ยง"? เป็นต้นปัญหานี้ไม่ได้ถูกกำหนดไว้อย่างดี หากคุณหมายถึง "วันนี้ตอนเที่ยงคืน" แสดงว่าคุณทำงานกับ DateTime แล้วไม่ใช่วันที่ ในการลบชั่วโมงคุณต้องมีหนึ่งชั่วโมงไม่ใช่หนึ่งวัน
xavier

12

ฉันส่งอีเมลไปที่ refsrcfeedback@microsoft.com และนั่นคือคำตอบของพวกเขา

Marcos นี่ไม่ใช่สถานที่ที่ดีในการถามคำถามเช่นนี้ ลองhttp://stackoverflow.com คำตอบสั้น ๆ คือคุณต้องมีรูปแบบที่จะเป็นตัวแทนจุดในเวลาและวันที่และเวลาไม่ว่าจะเป็นสถานการณ์ที่มีประโยชน์มากที่สุดในการปฏิบัติ ความจริงที่ว่ามนุษย์ใช้สองแนวคิด (วันที่และเวลา) เพื่อทำเครื่องหมายจุดตามเวลานั้นเป็นไปตามอำเภอใจและไม่มีประโยชน์ที่จะแยก

แยกเฉพาะที่ที่ได้รับการรับประกันอย่าทำสิ่งต่างๆเพียงเพื่อทำสิ่งต่างๆสุ่มสี่สุ่มห้า คิดอย่างนี้: คุณมีปัญหาอะไรที่แก้ไขได้โดยแยก DateTime เป็น Date and Time? แล้วจะมีปัญหาอะไรที่คุณไม่มีตอนนี้? คำแนะนำ: หากคุณดูการใช้งาน DateTime ในกรอบงาน. NET: http://referencesource.microsoft.com/#mscorlib/system/datetime.cs#df6b1eba7461813b#references คุณจะเห็นว่าส่วนใหญ่ถูกส่งคืนจากวิธีการ หากเราไม่มีแนวคิดเดียวเช่น DateTime คุณจะต้องใช้พารามิเตอร์หรือ Tuples เพื่อส่งคืนคู่ของวันที่และเวลา

HTH, Kirill Osenkov

ในอีเมลของฉันฉันถามว่าเป็นเพราะ DateTime ใช้ TimeZoneInfo เพื่อรับเวลาของเครื่อง - ในความเหมาะสมตอนนี้ ฉันจะบอกว่าเป็นเพราะ "กฎทางธุรกิจ" นั้น "ควบคู่กันเกินไป" พวกเขาจึงทำให้ฉันสับสน


โพสต์นี้ให้ข้อมูลเชิงลึกเกี่ยวกับความคิดเบื้องหลังการตัดสินใจออกแบบที่ไม่มีคลาสวันที่ในตัว คำถามที่คุณส่งมาคืออะไร? ฉันไม่ได้หมายความว่าจะบอกเป็นนัยว่าฉันเห็นด้วยกับการตัดสินใจนี้ด้วยเหตุผลที่ @TheMathemagician ระบุไว้ข้างต้น
Robert Jørgensgaard Engdahl

@ RobertJørgensgaardEngdahlน่าเศร้าที่ฉันไม่สามารถเข้าถึงบัญชีอีเมลนั้นได้อีกต่อไป แต่ฉันเชื่อว่าฉันได้ถามพวกเขาว่าทำไมพวกเขาถึงรวมเวลาและวันที่เข้าด้วยกันในโครงสร้าง DateTime และคิดว่าฉันเห็นด้วยกับ TheMathemagician ฉันคิดว่า MS ใช้แนวทางการออกแบบนี้เพราะในฐานะ บริษัท ระหว่างประเทศมันจ่ายเงินตามความต้องการของพวกเขาและตอนนี้ก็สายไปแล้วที่จะเปลี่ยนแปลงในขณะที่การแยกแนวคิดไม่ได้
MVCDS

2
บางที MS อาจจะไปทั้งหมูและใช้SpaceTimeคลาส! เฮ้ตามที่ไอน์สไตน์บอกว่าพื้นที่และเวลาเป็นสิ่งที่คู่กันอย่างแน่นหนาดังนั้นเราจึงไม่จำเป็นต้องแยกความแตกต่างระหว่างพวกเขาใช่ไหม? (!!!!!!!!!!!) ฉันนะใหม่ C # แต่ผมต้องบอกว่ามันเป็นเขตที่วางทุ่นระเบิดมาจาก VB.NET ที่เป็นเพียงdate, Today(), nowฯลฯ ไม่มีDateTimeprefixing ขยะไม่มี โกงเกี่ยวกับ (และอัฒภาคเหล่านี้และความไวต่อตัวพิมพ์เล็ก ๆ นี้แน่นอนว่ามันน่ารำคาญแค่ยิงฉันเดี๋ยวนี้!)
SteveCinq

2
และ SQL Server ของตัวเองมีDateประเภทและผลลัพธ์ต้องเป็นประเภทDate- หากเป็นDateประเภทผลลัพธ์ที่คาดว่าจะเป็นสตริงโดยไม่มีเวลา ตัวอย่างเช่น Delphi ยังมี Date เป็น DateTime แต่ typeinfo จะแตกต่างกันสำหรับ Date และ DateTime
user2091150

1
Kirill Osenkov กำลังตอบคำถาม "ทำไมไม่แยกคลาสวันที่และเวลาเทียบกับคลาส DateTime" จริง Q คือ "ทำไมไม่นอกจากนี้ยังมีวันที่แยกต่างหากและเรียนเวลา?" ฉันเข้าใจว่าวันที่และเวลาควรรวมกันเป็นคลาสเดียวสำหรับกรณีการใช้งานจำนวนมากของแนวคิดวันที่และเวลา อย่างไรก็ตามอาจมีอย่างน้อยที่สุดถ้าไม่มากเช่นเดียวกับกรณีการใช้งานที่ถูกต้องของแนวคิดวันที่ และแน่นอนมีหลายกรณีการใช้งานที่ถูกต้องของเวลาแนวคิดยัง
ทอม


4

หากคุณต้องการเรียกใช้การเปรียบเทียบวันที่ให้ใช้

yourdatetime.Date;

หากคุณกำลังแสดงไปที่หน้าจอให้ใช้

yourdatetime.ToShortDateString();

ส่วนวันที่คือสิ่งที่ฉันกำลังมองหา
Brendan Vogt

3

อนุญาตให้ฉันคาดเดา: อาจเป็นเพราะจนถึง SQL Server 2008 ไม่มีประเภทข้อมูลวันที่ใน SQL ดังนั้นจึงเป็นการยากที่จะเก็บไว้ในเซิร์ฟเวอร์ SQL ?? และหลังจากทั้งหมดเป็นผลิตภัณฑ์ของ Microsoft?


db datetime แตกต่างจาก C # datetime db datetime ไม่มีเขตเวลาดังนั้นจึงไม่ได้อ้างถึงช่วงเวลาใดเวลาหนึ่งจริงๆ แต่ C # รู้ว่าทันทีคือและเก็บเห็บตั้งแต่ยุค UTC
artsrc

2
การสนทนาเกี่ยวกับ DATE เฉพาะไม่ค่อยเกี่ยวกับส่วนวันที่และเวลาดังนั้นฉันจึงไม่เข้าใจประเด็นที่คุณพยายามทำ?
เพลิน

สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้เขียนโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
Barranka

@Barranka - คำถามประกอบด้วย "ทำไมไม่มีคลาส Date ใน C #"
STLDev

2

ใครจะรู้ว่าทำไมถึงเป็นแบบนั้น NET Framework มีการตัดสินใจที่ไม่ดีมากมาย อย่างไรก็ตามฉันคิดว่านี่เป็นเรื่องเล็กน้อย คุณสามารถเพิกเฉยต่อช่วงเวลาได้ตลอดเวลาดังนั้นแม้ว่าบางรหัสจะตัดสินใจให้ DateTime อ้างถึงมากกว่าวันที่ แต่รหัสที่ใส่ใจควรดูเฉพาะส่วนของวันที่เท่านั้น หรือคุณสามารถสร้างประเภทใหม่ที่แสดงถึงวันที่และใช้ฟังก์ชันใน DateTime เพื่อทำการยกของหนัก (การคำนวณ)


1
ฉันไม่คิดว่านี่เป็นการตัดสินใจที่ไม่ถูกต้องไม่ว่าคุณจะต้องการใช้เฉพาะวันที่หรือไม่ก็ตาม ฉันจะไม่ลงคะแนนคุณ แต่นั่นคือความคิดของฉัน
JonH

ฉันไม่คิดว่าฉันพูดได้ดี ฉันไม่ค่อยมีปัญหากับมันมากนักแม้ว่าฉันจะเห็นว่าการมีสองหรือสามประเภทจะเหมาะสมกว่าจากมุมมองที่เป็นนามธรรม / ความสง่างาม ประเด็นของฉันคือมีหลายสิ่งหลายอย่างในกรอบงาน. NET ที่อาจทำให้คุณเกาหัวและไม่คุ้มค่าที่จะอารมณ์เสียโดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่า "ปัญหา" นี้ค่อนข้างน้อยเมื่อเทียบกับการตัดสินใจออกแบบที่ร้ายแรงบางอย่าง (ทั่วไป ข้อ จำกัด )
siride

+1 เพราะมันเป็นเรื่องจริง ... นี่เป็นปัญหาเดียว (หรือปัญหาใหญ่ที่สุด) ของ. NET :-) :-) พวกเขาต้องเพิ่ม SQL Server กี่เวอร์ชันเพื่อเพิ่มประเภท DATE และ TIME และที่นั่นมีประโยชน์มากขึ้น (อย่างน้อยก็ด้วยเหตุผลด้านความสมบูรณ์)
xanatos

ฉันควรเพิ่มเติมด้วยว่าฉันคิดว่า "ทุกอย่างเริ่มต้นที่ -100 คะแนน" เป็นวิธีที่ดีในการสร้างกรอบที่ไม่ดีและนี่อาจเป็นหนึ่งในสิ่งที่จมอยู่ในขยะนั้น
siride

2
ฉันเพิ่งถูกกัดโดยปัญหานี้เนื่องจากส่วนหนึ่งของรหัสละเลยที่จะใช้คุณสมบัติ. วันที่และทำให้เปรียบเทียบไม่ถูกต้อง ฉันคิดว่าจำเป็นต้องมีประเภทวันที่ที่ไม่เก็บเวลาใด ๆ เพื่อหลีกเลี่ยงข้อผิดพลาดประเภทนี้
JoelFan

2

ทำไม? เราทำได้แค่คาดเดาและมันไม่ได้ช่วยแก้ปัญหาทางวิศวกรรมได้มากนัก การคาดเดาที่ดีคือDateTimeมีฟังก์ชันทั้งหมดที่โครงสร้างดังกล่าวจะมี

หากเป็นเรื่องสำคัญสำหรับคุณจริงๆให้ห่อDateTimeด้วยโครงสร้างที่ไม่เปลี่ยนรูปของคุณเองที่เปิดเผยเฉพาะวันที่ (หรือดูDateTime.Dateคุณสมบัติ)


2

นอกจากคำตอบของ Robert แล้วคุณยังมีDateTime.ToShortDateStringวิธีการ นอกจากนี้หากคุณต้องการวัตถุ Date จริงๆคุณสามารถใช้รูปแบบอะแดปเตอร์และตัดวัตถุ DateTime ที่เปิดเผยเฉพาะสิ่งที่คุณต้องการ (เช่นเดือนวันปี)


2

มีDateTime.Dateคุณสมบัติที่ตัดส่วนเวลาของDateTime. บางทีคุณอาจห่อหุ้มหรือห่อ DateTime ในประเภทวันที่ของคุณเองก็ได้

และสำหรับคำถามว่าทำไมฉันเดาว่าคุณจะต้องถาม Anders Heljsberg


1

เนื่องจากเพื่อที่จะทราบวันที่คุณต้องรู้เวลาของระบบ (ในเครื่องหมายขีด) ซึ่งรวมถึงเวลาด้วยเหตุใดจึงต้องทิ้งข้อมูลนั้นไป

DateTimeมีDateทรัพย์สินหากคุณไม่สนใจเลยเกี่ยวกับเวลา


1

ใช่ System.DateTime ถูกปิดผนึกด้วย ฉันเคยเห็นบางคนเล่นเกมด้วยการสร้างคลาสที่กำหนดเองเพียงเพื่อให้ได้ค่าสตริงของเวลาตามที่กล่าวไว้ในโพสต์ก่อนหน้านี้สิ่งต่างๆเช่น:

class CustomDate
{
    public DateTime Date { get; set; }
    public bool IsTimeOnly { get; private set; }

    public CustomDate(bool isTimeOnly)
    {
        this.IsTimeOnly = isTimeOnly;
    }

    public string GetValue()
    {
        if (IsTimeOnly)
        {
            return Date.ToShortTimeString();
        }

        else
        {
            return Date.ToString();
        }
    }
}

นี่อาจไม่จำเป็นเนื่องจากคุณสามารถแยก GetShortTimeString จากประเภท DateTime แบบเดิม ๆ โดยไม่ต้องใช้คลาสใหม่ได้


0

ถ้าคุณใช้คุณสมบัติ Date หรือ Today เพื่อรับเฉพาะส่วนวันที่จากวัตถุ DateTime

DateTime today = DateTime.Today;
DateTime yesterday = DateTime.Now.AddDays(-1).Date;

จากนั้นคุณจะได้รับองค์ประกอบวันที่โดยตั้งค่าส่วนประกอบเวลาเป็นเที่ยงคืนเท่านั้น


1
นี่ไม่ใช่สิ่งที่ฉันต้องการอย่างแน่นอน
Carlo V. Dango

@Carlo V. Dango: ฉันไม่เห็นด้วย ฉันคิดว่ามันเป็นสิ่งที่คุณต้องการ
siride

1
@Carlo V. Dango: คุณต้องการทำอะไรโดยเฉพาะที่คุณสมบัติเหล่านี้ไม่อนุญาตให้คุณทำสำเร็จ?
eph_tagh

5
มันค่อนข้างง่าย: รอยเท้าหน่วยความจำวันที่น่าจะเป็นเพียงครึ่งหนึ่งของรอยเท้าหน่วยความจำของ DateTime (32 แทนที่จะเป็น 64 บิต) คุณจะมั่นใจได้ว่าเพื่อนร่วมงานโง่ ๆ ของคุณไม่ได้เพิ่มเวลา (1) ถึงวันที่ของคุณเปลี่ยนไป แต่ "คงเดิม" จาก POV ของ "วันที่เท่านั้น" หาก (สำหรับข้อผิดพลาด) DateTime ถูกตั้งค่าเป็น DateTimeKind.Local และเวลาถูกทำให้เป็นมาตรฐาน UTC วันที่อาจจะเปลี่ยนไป (เกิดขึ้นกับฉันผ่านการใช้ XmlSerialization และทำไปกลับ JSON ไม่ดี) ... เพียงพอหรือไม่
xanatos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.