เหตุใดจึงไม่มีประเภทข้อมูล "วันที่เท่านั้น" ที่แท้จริง


24

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

ฉันคุ้นเคยกับการตั้งค่าส่วนเวลาของระเบียน "วันที่เท่านั้น" เป็น "เที่ยง" (ซึ่งจะหลีกเลี่ยงวันที่ที่เปลี่ยนแปลงตลอดเวลาไม่ว่าจะเป็นเขตเวลา) ดูเหมือนว่าแฮ็คและฉันจะหาบั๊กจากผู้พัฒนาอุปกรณ์ตัวจริงตลอดไปในเรื่องนี้

เวลาสัมพันธ์กับจุดคงที่เสมอ 4PM คือ 4 ชั่วโมงหลังเที่ยงหรือเที่ยง จุดที่สูงที่สุดของดวงอาทิตย์ในการเดินทางผ่านนั้นสามารถสังเกตได้และช่วยให้เราสามารถตั้งค่าระบบพิกัดได้ 3 ชั่วโมงก่อนเที่ยง (Ante Meridian) 2 ชั่วโมงหลังเที่ยง 1441899402938 มิลลิวินาทีนับตั้งแต่ 1 มกราคม 2513 สำหรับผู้ที่เลี้ยงในโลกคาร์ทีเซียนนี่เป็นลักษณะที่สอง

แต่ปฏิทินของเราถือกำเนิด Descartes ข้อโต้แย้งของฉันคือมันเป็นความคิดที่ถูกต้องมากขึ้นว่าเป็นการนับที่ฟังก์ชันโมดูโลถูกนำไปใช้ วันจันทร์ตามวันอาทิตย์และต่อ ๆ ไปจนกว่าคุณจะได้รับความจริงที่ว่าวันอาทิตย์เป็นวันเสาร์ ไม่มีบวกและลบมันเป็นโมดูลัสหรือค่าสัมบูรณ์

ในทำนองเดียวกันกับปีซ้ำ ทุก ๆ 365 วัน (หรือมากกว่านั้น) มีวันพิเศษหลายอย่างสำหรับฉัน: วันเกิดวันครบรอบวันเกิดของเด็ก ฯลฯ ฯลฯ แอปพลิเคชันการตั้งเวลาทางธุรกิจนั้นเต็มไปด้วยตัวอย่างของการประชุมทุกเจ็ดวันอังคารแรกของเดือน ฯลฯ เพียงเพราะ เราสามารถแมปสิ่งนี้กับเลขทศนิยมและในความจริงแล้วการจับคู่กับตัวเลขนั้นแก้ปัญหามากมายที่ยากแบบเก่า ๆ แต่นั่นไม่ได้หมายความว่ามันเป็นวิธีเดียวที่จะทำได้

การรับรู้และความเข้าใจธรรมชาติของ "สี่เหลี่ยมหมุดในรูกลม" ของการใช้ DateTimes เพื่อจัดเก็บวันที่ทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้นในความคิดของฉัน

มีค่าในแอปพลิเคชันที่ตั้งใจไว้อย่างชัดเจนว่าเป็นแอปพลิเคชั่นการกำหนดตารางเวลาในการกำหนดคลาส Date หรือ "ถูกตั้งค่าทุกครั้งเป็นเที่ยง" เป็นวิธีการที่ดีที่สุดหรือไม่? อาจมีปัญหาอะไรบ้างในการใช้ DateTime และตั้งค่าคอมโพเนนต์ Time เป็น Noon สามารถเปลี่ยนเขตเวลาได้หรือไม่ในแนวทางดังกล่าว ฉันใช้ MomentJS แต่ฉันคิดว่านั่นเป็นเพียงชั้นเรียนที่ดีกว่า


7
นี่เป็นคำถามที่น่าสนใจทีเดียว ยกตัวอย่างวันเกิดมันมีเหตุผลสำหรับมนุษย์จริงๆฉันอยู่ในที่เดียวและทุกคนตื่นขึ้นมาในเวลาเดียวกัน ทันทีที่คุณต้องแสดงมันในเชิงคณิตศาสตร์มันจะซับซ้อนมาก เช่นเดียวกับสิ่งต่าง ๆ เช่นเวลาเริ่มต้น / สิ้นสุดของกะงาน ฯลฯ พวกเขาไม่ได้ 'เวลา' พวกเขาคือ 'ชั่วโมงของวันในเขตเวลาที่คุณกำลังทำงาน'
Ewan

3
NodaTime (ไลบรารี C # สำหรับ Date & Time) มีประเภทของวันที่
CodesInChaos

5
เก็บเวลาของคุณเป็น UTC ไม่มีปัญหาเกี่ยวกับวันที่ไม่มีปัญหาเกี่ยวกับเขตเวลา
Loren Pechtel

3
"แต่พระเจ้านี่ดูเหมือนแฮ็คและฉันจะหาบั๊กจากผู้พัฒนาอุปกรณ์รุ่นใหม่ตลอดไป" - ทำไมคุณไม่สร้างคลาส DateOnly ของคุณเองหรืออะไรก็ได้แล้วเรียกมันว่าวันละ
Brandin

5
@MichaelBlackburn ฉันจริงจัง คำอธิบายของคุณฟังว่าสถานการณ์สำหรับประเภทข้อมูลของตัวเองซึ่งบังคับใช้กฎทางธุรกิจ (วันที่เท่านั้นเช่นคุณสามารถจัดเก็บเป็น "DateTime" ภายในด้วยส่วนเวลาที่กำหนดเป็นเที่ยง) แต่จากนั้นเปิดเผยเฉพาะส่วนที่คุณต้องการ (เดือน วันเป็นต้นปี / ไม่ปี)
Brandin

คำตอบ:


15

ก่อนอื่นเรามาทำความเข้าใจกัน: วันเกิดเป็นสิ่งหนึ่งวันเกิดก็เป็นอีกอย่าง วันเกิดเป็นชนิดข้อมูลที่แปลกใหม่เพราะมันขาดไม่ได้เป็นเพียงองค์ประกอบของชั่วโมงนาที ฯลฯ แต่ยังขาดองค์ประกอบปี หากคุณต้องการจัดการกับวันเกิดฉันขอแนะนำให้ประดิษฐ์ประเภทข้อมูลของคุณเองซึ่งไม่มีอะไรเลยนอกจากตัวเลขเดือนและตัวเลขวันและไม่เกี่ยวข้องกับชนิดข้อมูลวันเวลาในตัว

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

ให้ฉันพูดสั้น ๆ ว่ามันไม่เป็นความจริงที่ภาษาการเขียนโปรแกรมทั้งหมดเสนอเฉพาะชนิดข้อมูลชั่วคราวซึ่งรวมถึงองค์ประกอบเวลา ฉันเจอประเภทข้อมูลเฉพาะวันที่ใน RDBMS และภาษาถิ่น SQL ที่สอดคล้องกัน แต่นั่นไม่เกี่ยวข้อง: ความจริงที่ว่าชนิดข้อมูลเหล่านี้ไม่ได้หมายความว่ามันเป็นสิ่งที่ดีและ RDBMS มีประวัติอันยาวนานของการทำให้เกิดความสับสนกับการจัดเก็บด้วยการเป็นตัวแทน

คุณจะเข้าใจว่าเหตุใดจึงเป็นความคิดที่ดีที่จะมีประเภทข้อมูลเฉพาะวันที่ในขณะที่คุณตระหนักว่าเวลานั้นเป็นพิกัด คนส่วนใหญ่มีความคิดที่คลุมเครือว่าเวลาคืออะไรและความคิดนี้มีความคิดทางวัฒนธรรมที่เป็นความลับเช่นปีเดือนและวันโดยไม่ทราบว่าแนวคิดเหล่านี้เป็นเพียงตัวแทน : พวกเขามีประโยชน์สำหรับการเป็นตัวแทนของเวลากับมนุษย์เท่านั้น เวลาในการป้อนข้อมูลจากมนุษย์ ที่เลเยอร์ใด ๆ ที่อยู่ด้านล่างการควบคุม GUI การป้อนข้อมูลตามเวลาจริงเวลาควรเป็นและโดยปกติจะแทนด้วยพิกัดเวลาซึ่งเป็นหน่วยเวลาจำนวนหนึ่งตั้งแต่จุดกำเนิดบางจุด

ตัวอย่างเช่นในDateTimeชนิดข้อมูลของ Microsoft Dotnet หน่วยเวลาคือ 100 นาโนวินาทีและที่มาของเวลาคือ 12:00 เที่ยงคืนวันที่ 1 มกราคม 0001 CE

อีกตัวอย่างหนึ่งของความลับที่เป็นตัวแทน แต่เพียงผู้เดียวคือการวัดมุมองศาใช้สัญกรณ์นาทีขององศาและวินาทีแห่งองศา แน่นอนว่าเพื่อให้การคำนวณที่เป็นประโยชน์เสร็จสิ้นคุณต้องใช้เรเดียนภายในและหากจำเป็นต้องแปลงเป็นองศาจากเมื่อมีปฏิสัมพันธ์กับผู้ใช้ที่เป็นมนุษย์

ดังนั้นอย่าสับสนกับการเป็นตัวแทนของการวัดที่มนุษย์สามารถอ่านได้ด้วยธรรมชาติที่แท้จริงของการวัด บ่อยครั้งที่วิธีการในอุดมคติสำหรับการวัดซึ่งใกล้เคียงกับธรรมชาติของการวัดมากที่สุดนั้นแตกต่างจากการเป็นตัวแทนที่มนุษย์สามารถอ่านได้ของการวัดนั้น

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

ปัญหาของคุณเกี่ยวกับวันเดือนปีเกิดคือคุณมีเวลาประสานงานที่ไม่แน่นอน : บุคคลนั้นเกิดมาในช่วงเวลาที่ระบุ แต่ชั่วโมงและนาทีไม่ได้ถูกบันทึกโดยโรงพยาบาลหรือเราไม่มี สนใจพวกเขา ดังนั้นสิ่งที่เกิดขึ้นจริงก็คือการประสานงานวันที่และเวลาเกิดของคุณมีข้อผิดพลาดความอดทนหรือความไม่แน่นอนถ้าคุณต้องการและมันเป็นสิ่งที่ดีที่สุดในการรักษามัน: วางไว้ตรงกลาง ของวันและพิจารณาความไม่แน่นอนโดยนัย +12 -12 ชั่วโมง และนั่นคือทางออกที่คุณได้มาโดยสัญชาตญาณ


4
สิ่งนี้ไม่เป็นความจริงสำหรับ "วัน" ซึ่งเป็นแนวคิดที่เก่ากว่าเวลา พวกมันถูกคิดว่าเป็นการแจงนับหรือโมดูลัสอย่างเหมาะสมที่สุด วันอาทิตย์ตามวันจันทร์ ฯลฯ จนกว่าเราจะกลับถึงวันอาทิตย์ซึ่งตามวันเสาร์ มันเป็นสิ่งที่แตกต่าง
Michael Blackburn

10
ดีแน่นอนโรงพยาบาลเขียนลงเวลาของการเกิด - ที่มาตรฐานการปฏิบัติในโรงพยาบาลส่วนใหญ่ นั่นไม่ใช่ปัญหาเลย ปัญหาคือเพื่อวัตถุประสงค์ในการรำลึกถึงเหตุการณ์ (วันเกิดวันหยุดวันครบรอบ ฯลฯ ) ผู้คนไม่ได้ใช้หรือต้องการความละเอียดที่ดีกว่า 1 วัน ไปถามคนแรกที่คุณเห็นเมื่อวันเกิดของพวกเขาและพวกเขาจะให้เดือนและวัน แต่ไม่เคยชั่วโมงและนาที นอกจากนี้: เราใช้หน่วยที่มีสเกลตลอดเวลา: มิลลิเมตรกิโลกรัมเมกกะวัตต์และแน่นอนไมโครฟอร์แมต
คาเลบ

4
-1: ไม่ใช่การใช้เวลาทั้งหมดเพื่อเป็นตัวแทนของช่วงเวลาหนึ่ง วันเกิดเป็นแนวคิดที่แตกต่างซึ่งแสดงด้วยเดือนและวันในปฏิทินเกรโกเรียน มันสมเหตุสมผลที่จะถามว่า "มันเป็นวันเกิดของเควินวันนี้เหรอ?" คำตอบนั้นขึ้นอยู่กับตำแหน่ง ถ้าฉันอยู่ในซิดนีย์มันอาจเป็นวันเกิดของฉัน แต่ถ้าฉันอยู่ในโฮโนลูลูแทนมันคงไม่เป็นเวลาหลายชั่วโมง
วินไคลน์

6
@MikeNakis ผลลัพธ์จะเป็น microamps ไม่ใช่เรื่องไร้สาระ สำคัญกว่า: เมื่อคุณใช้วันที่แทนที่จะเป็นวินาทีหรือมิลลิวินาทีโดยทั่วไปคุณจะพูดถึงทั้งวัน - ช่วงเวลา - มากกว่าเวลาที่กำหนดและขึ้นอยู่กับบริบทอาจเป็นเหตุการณ์ที่เกิดซ้ำ
คาเลบ

4
OP กำลังพูดถึงวันเกิดซึ่งเป็นตัวแทนของ java.util.MonthDay วันเกิดไม่ใช่การวัดมันเป็นความคิดของมนุษย์ในแต่ละวัน มีความคิดของมนุษย์มากมายเกี่ยวกับเวลาที่ไม่ได้เป็นตัวแทนของจุดเดียวในเวลา
วินไคลน์

9

วันที่และเวลาเป็นสิ่งที่แตกต่างกันมากขึ้นอยู่กับบริบทและคุณต้องแยกประเภทหลายประเภทเพื่อครอบคลุมทุกกรณีการใช้งาน

DateTimeประเภทในปัจจุบันในหลายภาษาแทนจุดที่แม่นยำในเวลา (เวลา "ทันที") นอกเหนือจากนี้เรามีแนวคิดเกี่ยวกับเวลาและไทม์แพนของญาติหรือมนุษย์เช่นวันในปฏิทิน, วันที่เกิดซ้ำ, เดือน, ปี ฯลฯ ซึ่งในหลายกรณีนั้นไม่ชัดเจนและขึ้นอยู่กับบริบท ประเภทเหล่านี้ไม่ได้มีประโยชน์ในระดับสากล แต่จำเป็นในโดเมนแอปพลิเคชันที่เฉพาะเจาะจงเช่นปฏิทินเครื่องมือกำหนดเวลาและแอปพลิเคชันอื่น ๆ ที่โต้ตอบกับแนวคิดของมนุษย์ในเวลา

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

LocalDateแน่นอนว่าง่ายกว่าDateTimeเพราะไม่ต้องคำนึงถึงเขตเวลา แต่คุณควรตระหนักถึงปัญหาอื่น ๆ เช่นวันที่ปัจจุบันอาจย้อนกลับไปจริง ๆ เมื่อคุณข้ามเขตเวลาและเวลาทันทีอาจเหมือนกัน สอดคล้องกับวันที่แตกต่างกันในเขตเวลาที่แตกต่างกัน หากคุณใช้วันที่ท้องถิ่นในเครือข่ายหรือเว็บแอปคุณควรระมัดระวังเกี่ยวกับปัญหาเหล่านี้ การลบส่วนของเวลาออกจากวันที่ไม่สามารถแก้ปัญหาพื้นฐานของเขตเวลาได้! และหากคุณพิจารณาถึงวันที่ในประวัติศาสตร์และวัฒนธรรมที่แตกต่างกันการพิจารณามันจะยิ่งซับซ้อนมากขึ้นเนื่องจากวันที่เดียวกันอาจตรงกับกรณีที่แตกต่างกันอย่างมากในเวลาเช่นจูเลียนกับปฏิทินเกรกอเรียน

ตอนนี้คุณถามว่าทำไมภาษาไม่มีอะไรLocalDate ในตัว ก่อนอื่นบางภาษาเช่น SQL และ Visual Basic มีประเภทวันที่โดยไม่มีเวลา และจาวายังได้เพิ่มLocalDateในรุ่นล่าสุด แต่แพลตฟอร์มอื่น ๆ เช่น. Net ไม่ได้ เฉพาะนักออกแบบภาษาเท่านั้นที่สามารถตอบได้ว่าทำไมไม่รวมอยู่ในไลบรารีมาตรฐาน แต่ฉันเดาว่า "เวลาทันที" เป็นแนวคิดที่เรียบง่ายและมีประโยชน์ในระดับสากลในขณะที่แนวคิดเวลาอื่นมีประโยชน์สำหรับโดเมนแอปพลิเคชันเฉพาะเท่านั้น .) ดังนั้นจึงเหมาะสมที่จะให้นักพัฒนาแอปพลิเคชันเขียนประเภทที่กำหนดเองเพื่อจัดการกับกรณีการใช้ที่ซับซ้อนมากขึ้นหรือปล่อยให้มันถูกจัดการโดยห้องสมุดบุคคลที่สาม (เช่น Joda-time)


5

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

อาจเป็นเพราะปฏิทินมีความซับซ้อนและถูกนำมาใช้ในรูปแบบที่แตกต่างกันมากมายจนไม่มีใครสามารถคิดคลาสที่เรียบง่าย แต่มีความกว้างพอที่จะเป็นประโยชน์ในหลาย ๆ

ประเภทวันที่ที่พบโดยทั่วไปในภาษาการเขียนโปรแกรมสามารถใช้ในการทำธุรกรรมวันที่อย่างแม่นยำในระบบคอมพิวเตอร์ กรณีใช้งานอื่น ๆ น่าจะต้องใช้ห้องสมุดที่กำหนดเอง

นี่คือรายการสั้น ๆ ของข้อเท็จจริงเกี่ยวกับปฏิทินแสดงให้เห็นถึงความซับซ้อนของพวกเขา - ส่วนใหญ่เป็นประวัติศาสตร์ดังนั้นหากคุณกำลังจำกัดความสนใจของคุณเพื่อวันที่หลัง 1.1.1970 คุณจะไม่ได้รับผลกระทบจากสิ่งนี้ อย่างไรก็ตามหากใบสมัครของคุณต้องการทำงานกับวันที่ที่เกิดขึ้นก่อนปลายศตวรรษที่ 19 ข้อเท็จจริงเหล่านี้ก็จะสำคัญ กรณีใช้ที่เป็นไปได้คือฐานข้อมูลเชิงประวัติศาสตร์ของทุกประเภท (หนังสือลำดับวงศ์ตระกูล) แต่ยังเป็นทรัพย์สินของ บริษัท หรือองค์กรขนาดใหญ่ที่ยังคงทำกิจกรรมอยู่ในปัจจุบัน

ข้อเท็จจริงทั้งหมดเหล่านี้ได้มาจากคำถามที่พบบ่อยที่ยอดเยี่ยมที่พบในห้องสมุดปฏิทินสำหรับ OCaml เขียนโดย Julien Signolles

  1. ปฏิทิน Julian ได้รับการแนะนำโดย Julius Caesar ใน 45 ปีก่อนคริสตกาล มันเป็นเรื่องที่ใช้กันทั่วไปจนถึง 1500 เมื่อประเทศเริ่มเปลี่ยนเป็นปฏิทินเกรกอเรียน (ส่วนที่ 2.2) อย่างไรก็ตามบางประเทศ (เช่นกรีซและรัสเซีย) ใช้มันในช่วงปี 1900 และโบสถ์ออร์โธดอกซ์ในรัสเซียยังคงใช้มันเช่นเดียวกับโบสถ์ออร์โธดอกซ์อื่น ๆ

  2. การสลับจากปฏิทินจูเลียนไปเป็นปฏิทินเกรกอเรียนไม่ได้เกิดขึ้นอย่างสม่ำเสมอและขึ้นอยู่กับปีที่มีการเปลี่ยนแปลง 10 ถึง 13 วันถูกทิ้ง เช่นในประเทศฝรั่งเศส 9 ธันวาคม 1582 ตามด้วย 20 ธันวาคม 1582 และในกรีซ 9 มีนาคม 1924 ตามด้วย 23 มีนาคม 1924

  3. แม้ในยุคปัจจุบันมีการใช้ปฏิทินที่แตกต่างกันหลายอย่าง (เกรกอเรียนออร์โธดอกซ์อิสลามและจีน) เพื่ออ้างอิงบางส่วนซึ่งทั้งหมดใช้วิธีที่แตกต่างกันในการคำนวณปีและวันครบรอบหรือวันเฉลิมฉลองทางศาสนา

ตอนนี้คุณหวังว่าจะมีประเภทวันที่ที่มาพร้อมกับการดำเนินการที่มีประโยชน์สำหรับการดำเนินธุรกิจทั่วไป ฉันเดาว่ามันไม่มีอะไรที่เหมือนกับการดำเนินธุรกิจทั่วไป ตัวอย่างเช่นในโลกการเงินเราต้องคำนวณ:

  1. เศษส่วนปี (เช่น“ 6 เดือน” ตรงกับ“ 0.5”) ซึ่งใช้ร่วมกับอัตราดอกเบี้ยเพื่อคำนวณดอกเบี้ยที่แท้จริงของเงินกู้ตามระยะเวลาที่กำหนด มีสูตร 6 ถึง 10 สูตรในการคำนวณเศษส่วนเหล่านี้แต่ละสูตรแตกต่างกันไปตามวิธีที่พวกเขาจัดการกับความยาวของปีอธิกสุรทินตำแหน่งของช่วงเวลาที่เกี่ยวกับวันสุดท้ายของเดือนกุมภาพันธ์และระยะเวลาของเดือน

  2. การเลื่อนวันที่เมื่อคำนวณวันครบรอบเราใช้ปฏิทินธุรกิจและกฎ (เลือกจากชุดของกฎที่แตกต่างกันมากกว่า 6 กฎ) เพื่อเปลี่ยนวันครบรอบจากวันหยุดเป็นวันทำการ

สำหรับคนที่ทำงานในอุตสาหกรรมการเงินประเภทปฏิทินใด ๆ ที่ไม่ได้ใช้ฟังก์ชั่นและกฎเหล่านี้ทั้งหมดจะไร้ประโยชน์ มีแนวโน้มว่าอุตสาหกรรมอื่น ๆ จะมีนิสัยและการประชุมประเภทอื่นที่ต้องการการคำนวณแบบกำหนดเองในปฏิทิน

มีค่าในแอปพลิเคชันที่ตั้งใจไว้อย่างชัดเจนว่าเป็นแอปพลิเคชั่นการกำหนดตารางเวลาในการกำหนดคลาส Date หรือ "ถูกตั้งค่าทุกครั้งเป็นเที่ยง" เป็นวิธีการที่ดีที่สุดหรือไม่? อาจมีปัญหาอะไรบ้างในการใช้ DateTime และตั้งค่าคอมโพเนนต์ Time เป็น Noon สามารถเปลี่ยนเขตเวลาได้หรือไม่ในแนวทางดังกล่าว ฉันใช้ MomentJS แต่ฉันคิดว่านั่นเป็นเพียงชั้นเรียนที่ดีกว่า

หากคุณต้องการติดตามวันปฏิทินเดียววิธีที่ดีที่สุดน่าจะใช้จำนวนเต็มขนาดใหญ่แทนวันจูเลียนในวันปฏิทินนั้น อัลกอริทึมในการแปลงไปมาระหว่างวันจูเลียนเป็นวันปฏิทิน - ซึ่งอธิบายด้วยปีเดือนและปฏิทิน - เป็นที่รู้จักอย่างกว้างขวางและผ่านการทดสอบอย่างถี่ถ้วนเพื่อให้คุณสามารถนำไปใช้ในแอปพลิเคชันของคุณได้อย่างง่ายดาย กรณีที่จะคำนวณวันครบรอบของเหตุการณ์ที่เกิดขึ้นในวันที่ 29 Februray


2

ฉันคิดว่า Mike Nakis ในคำตอบของเขาด้านบนทำงานได้ดีกว่าที่ฉันสามารถอธิบายได้ว่าเวลาโดยทั่วไปคือการประสานงานที่วัดได้อย่างสมบูรณ์และการสื่อสารอื่นใดที่ควรระบุรัฐหรือการคงอยู่ของการประสานงานในเวลานั้น

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

คุณสามารถดูว่าคำถามที่ดูเหมือนง่าย ๆ นี้ซับซ้อนได้จริงเพียงใด

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

เวลาเป็นพิกัดจริง แต่นอกเหนือจากวันที่เท่านั้นให้พิจารณาข้อมูลเวลาอื่นที่มีความจำเป็นซึ่งอาจต้องการ:

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

ในฐานะผู้ใช้ฉันต้องการให้งานนี้ทำ 15 วินาทีหลังจากเสร็จงานเที่ยงคืนทุกวันพุธ

ช่วงเวลา:ช่วงเวลาระหว่างสองเวลาที่ระบุ กรณีการใช้งานที่คุณอาจต้องการพิจารณาช่วงเวลา

ในฐานะผู้ใช้ฉันต้องเห็นทุกวันของเดือนที่มีอยู่ทั้งหมดภายในช่วงเวลาที่กำหนด

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

ดังนั้นโดยสรุปข้อมูลทั้งหมดนี้ย่อมนำไปสู่การพิจารณาในการออกแบบต่อไปนี้:

  • จุดหรือช่วงเวลาที่เฉพาะเจาะจงควรคงอยู่ใน UTC หรือประเภทข้อมูลบางอย่างที่มีข้อมูลเพียงพอที่จะแยกกลับเป็น UTC ได้อย่างง่ายดายหากจำเป็น
  • ควรเขียนตรรกะของแอปพลิเคชันเพื่อจัดรูปแบบ UTC หรือช่วงพิกัด UTC ลงในสถานะข้อมูลที่เป็นตัวแทนซึ่งย่อยได้มากขึ้นสำหรับผู้ใช้ปลายทาง
  • ระยะเวลาที่สำคัญควรคงอยู่ในหน่วยมิลลิวินาที
  • สถานที่ที่เฉพาะเจาะจงหรือการตั้งค่าของผู้ใช้ปลายทางในการแสดงข้อมูลใด ๆ ที่เกี่ยวข้องกับเวลาควรได้รับการยืนยันว่าเป็นข้อมูลเพิ่มเติมและถือว่าเป็นตัวเลือกการแสดงผล (เช่น Kiosk A, เขตเวลากลาง, รูปแบบเวลาทางการทหารหรือการตั้งค่าผู้ใช้ B, เวลามาตรฐานในเขตเวลาของเทลอาวีฟ (GMT + 7: 00) ฯลฯ ))
  • หลีกเลี่ยงหมายเลข FP

1
สิ่งนี้ไม่เป็น "สิ่งที่หลีกเลี่ยงไม่ได้" อาจเป็นเรื่องธรรมดาสำหรับแอปพลิเคชั่นจำนวนมาก แต่ Large Hadron Collider เกี่ยวข้องกับเหตุการณ์ในระดับนาโนวินาที เวลาของระบบถูกย้ายไปยังไมโครวินาทีเนื่องจากมิลลิวินาทีมีความแม่นยำไม่เพียงพอ แอพปฏิทินจำเป็นต้องมีแนวคิดของวันที่ที่เกิดขึ้นในวันปฏิทินท้องถิ่นไม่ว่าคุณจะอยู่ในเขตเวลาเดียวกันกับที่คุณสร้างเหตุการณ์หรือไม่
Alan Shutko

1
@AlanShutko และใช่ว่า "ข้อมูลเพิ่มเติม" ที่จำเป็นคือสิ่งต่าง ๆ เช่นเขตเวลาท้องถิ่นและวันและข้อมูลสำคัญอื่น ๆ ที่ต้องบันทึก สิ่งเหล่านี้ล้วน แต่เป็นนามธรรม แต่เป็นจุดเดียวในเวลาแม้ว่าจุดในเวลาไม่สำคัญกับอัลกอริทึมของคุณ ตราบใดที่ระดับนาโนวินาทีและแม้แต่ระดับไมโครวินาทีคำตอบของฉันมุ่งเน้นไปที่เว็บและซอฟต์แวร์ประเภท LOB มากขึ้น ฉันสงสัยว่าภาษาที่เลือกของ LHC คือ C # หรือ Javascript
maple_shaft

1
มิลลิวินาทีเหมาะสำหรับกระบวนการทางกายภาพที่ทำซ้ำได้ สำหรับกิจกรรมของมนุษย์บางครั้งหน่วยที่เหมาะสมคือวันที่ระบุเช่นถ้าส่งเมื่อสิ้นวันจะสามารถใช้งานได้ที่ปลายทางสามวันต่อมา
วินไคลน์

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

ไมค์ฉันคิดว่าข้อกังวลของเขาอยู่ที่การคำนวณ FP ทางคณิตศาสตร์อย่างหลีกเลี่ยงไม่ได้เพราะมันแปลงจากทศนิยมเป็นค่าไบนารี ตัวอย่างเช่น 0.3 เป็นทศนิยมซ้ำเมื่อแสดงเป็นหมายเลข FP แบบไบนารีดังนั้นจึงไม่สามารถแสดงได้อย่างแน่นอน ไม่ใช่ว่าคุณขาดความสามารถ แต่คุณขาดความแม่นยำ
Michael Blackburn

2

กล่าวโดยย่อเพราะประเภทเวลาตามคอมพิวเตอร์ส่วนใหญ่มุ่งเน้นไปที่การจัดการปัญหาเวลาและเขตเวลาอย่างถูกต้อง

มี 2 ​​กรณีขอบที่ไม่ได้รับการบริการที่ดีจากวิธีการปกติ การตั้งค่าจุดเวลาที่อยู่อีกด้านหนึ่งของการเปลี่ยนแปลงการปรับเวลาตามฤดูกาลโดยใช้เวลาท้องถิ่นซึ่งจะถูกแปลงใน UTC ด้วยเลเยอร์นามธรรมที่ต่ำกว่าและจากนั้นทำให้คุณมีเวลา 1 ชั่วโมง / สายสำหรับการประชุม

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

ข้อเสนอแนะในคำถามเป็นการตั้งค่าวันที่ให้มีเวลาเที่ยง UTC จะทำงานเกือบทุกที่ UTC ออฟเซ็ตอยู่ในช่วง -12 ถึง +14 ดังนั้นจึงมีบางสถานที่ในแปซิฟิกที่วิธีการนี้จะล้มเหลว ฉันมักจะปฏิบัติกับชนิดข้อมูลเหล่านี้เป็นสตริงในรูปแบบ yyyymmdd และถ้าฉันต้องทำการเปรียบเทียบการคำนวณระหว่างสองวันนี้สามารถทำได้อย่างปลอดภัยเป็นการเปรียบเทียบสตริง เมื่อทำการเปรียบเทียบเดลต้า (เช่นระหว่างวันที่และตอนนี้หรือระยะเวลาจนถึงอายุ X) คุณต้องตรวจสอบให้แน่ใจว่าวันที่ทั้งหมดถูกสร้างใน UTC ออฟเซ็ตเดียวกันและจากนั้นสามารถใช้ฟังก์ชันเวลามาตรฐานเพื่อทำงาน


3
" ฉันมักจะปฏิบัติกับชนิดข้อมูลเหล่านี้เป็นสตริงในรูปแบบ yyyymmdd และถ้าฉันต้องทำการเปรียบเทียบการคำนวณระหว่างวันที่สองวันสิ่งนี้สามารถทำได้อย่างปลอดภัยเมื่อเปรียบเทียบกับสตริง " นั่นแน่นอนว่าฟังดูเป็นDateประเภทข้อมูล aString
Ross Patterson

เช่นเดียวกับที่คุณพูดสตริงแสดงถึงวันที่และไม่เหมือนกับโปสเตอร์ต้นฉบับวันที่จะไม่เปลี่ยนแปลงโดยอยู่ในเขตเวลา UTC + 13
Michael Shaw

2

เหตุใดจึงไม่มีประเภทข้อมูล "วันที่เท่านั้น" ที่แท้จริง

ด้วยเหตุผลเดียวกันผมคิดว่าค่า DateTime ที่ระบุไว้โดยทั่วไปใน UTC: ความเรียบง่ายและความน่าเชื่อถือ จุดของค่า DateTime คือการระบุจุดเดียวในเวลาที่ไม่ได้รับผลกระทบจากเขตเวลาการประหยัดเวลากลางวันปฏิทินและการปรับเปลี่ยนในท้องถิ่นอื่น ๆ ค่า DateTime ระบุหนึ่งทันที (มากถึงขีด จำกัด ของความละเอียดของประเภท) ไม่ใช่ช่วงเวลาหรือชุดของเวลา ข้อ จำกัด เหล่านี้ทำให้สามารถเปรียบเทียบค่า DateTime ในวิธีที่เชื่อถือได้คาดการณ์ได้และไม่ซับซ้อน

การพยายามระบุวันที่ด้วยค่า DateTime นั้นเหมือนกับการพยายามใช้จุดเพื่อระบุพื้นที่คุณสามารถทำให้งานนั้นโดยใช้การประชุมเช่น "จุดนี้แสดงถึงศูนย์กลางของวงกลมที่มีรัศมี 100m" แต่มีปัญหามากมายที่นั่น: ทุกคนต้องใช้การประชุมเดียวกันคุณต้องเขียนกลุ่ม รหัสสนับสนุนเพื่อให้การทำงานกับประเภทที่ไม่ถูกต้องเจ็บปวดน้อยลงและรับประกันได้ว่าในบางจุดคุณจะต้องระบุพื้นที่ที่มีขนาดใหญ่หรือเล็กกว่าพื้นที่ทั่วไป ดังนั้นจึงขึ้นอยู่กับวันที่: คุณสามารถใช้ 'เที่ยง' เป็นเวลาปกติในการระบุวันที่ แต่จากนั้นคุณจะเข้าสู่โซนเวลาเพราะผู้คนคาดว่าจะระบุวันที่ในเวลาท้องถิ่นของพวกเขาแทนที่จะเป็น UTC และแม้ว่าคุณจะมีวิธีที่น่าพอใจในการใช้ DateTime เพื่อระบุวันที่คุณจะต้องการข้อมูลเพิ่มเติมเพื่อทราบว่าเป็นวันที่แน่นอนหรือวันที่สัมพันธ์: 4 กรกฎาคม พ.ศ. 2319 หรือทุก ๆ 4 กรกฎาคม ถ้าคุณต้องการทำซ้ำโดยใช้ช่วงเวลาอื่น และปฏิทินมีปัญหาบ้า ๆ บอ ๆ หลายเดือน: บางเดือนก็นานกว่าคนอื่น ๆ บางปีก็ยาวกว่าคนอื่นบางวันก็ยาวกว่าคนอื่นและบางวันก็มีปฏิทินที่มีช่องว่างอยู่ คุณไม่ต้องการที่จะแก้ปัญหาเหล่านี้เพียงแค่ทั้งวันเพราะปัญหาเดียวกันเกิดขึ้นในช่วงเวลาสั้น ๆ : คุณอาจต้องการเขียนโค้ดที่แสดงว่า "กิน 1 เม็ดทุก 4 ชั่วโมง" อย่างง่ายดายเหมือน " กลุ่มพบกันทุกวันศุกร์ที่สาม "

ดังนั้นจึงมีความซับซ้อนมากมายที่เกี่ยวข้องกับการทำงานกับวันที่ มันค่อนข้างง่าย (ไม่มีจุดประสงค์ในการเล่นสำนวน) ง่ายต่อการจัดเตรียมประเภทที่ระบุเวลาและทำงานกับมันตามที่คุณต้องการ แต่เป็นเรื่องยากมากที่จะจัดเตรียมประเภทที่ตอบโจทย์ทุกวิธีที่ใช้วันที่

เป็นคนอื่นได้ชี้ให้เห็นมีมีภาษาและห้องสมุดที่ให้การสนับสนุนที่ดีสำหรับวันที่และก็มักจะเป็นความคิดที่ดีที่จะใช้พวกเขาได้รับมันค่อนข้างยากที่จะได้รับรหัสวันที่เกี่ยวข้องกับตรงขวา


2
"ยากที่จะระบุประเภทที่ระบุวิธีการทั้งหมดที่ใช้วันที่" จริงซึ่งเป็นเหตุผลว่าทำไมจึงเป็นความคิดที่น่ากลัวที่จะพยายามจัดเตรียมประเภทที่จะทำทุกอย่าง Java รุ่นแรกให้บริการเฉพาะ java.util.Date และผลลัพธ์ก็น่ากลัว จากนั้นพวกเขาเพิ่มลำดับชั้น java.util.Calendar ที่ซับซ้อนและมันก็ไม่ได้ดีขึ้นมาก
วินไคลน์

1
@kevincline เห็นด้วยอย่างเต็มที่ OP ไม่ได้ระบุภาษาดังนั้นฉันจึงตั้งเป้าหมายสำหรับความเป็นอยู่ทั่วไป
คาเลบ

" ด้วยเหตุผลเดียวกันฉันคิดว่าค่า DateTime โดยทั่วไปจะระบุไว้ใน UTC " ... โอ้นั่นจะเป็นจริงหรือไม่ มันคือปี 2015 และยังมีรหัสจำนวนมากที่ถูกเขียนโดยใช้เขตเวลาที่บ้านของผู้แต่ง :-(
Ross Patterson

1
ฉันสงสัยอย่างแท้จริงว่าทำไมไม่มีการประชุมโดยรอบที่ยอมรับกันโดยทั่วไป "การใช้จุดเพื่อเป็นตัวแทนของพื้นที่" ของคุณนั้นทำให้ฉันรู้สึกหงุดหงิดมาก
Michael Blackburn

2

เหตุใดจึงไม่มีประเภทข้อมูล "วันที่เท่านั้น" ที่แท้จริง

มีหลายประเภทในห้องสมุดต่าง ๆ สำหรับภาษาต่าง ๆ มีเกือบหนึ่งอย่างสำหรับภาษาปัจจุบันของคุณ แพคเกจ Java util มี API ที่น่ากลัวสำหรับการคำนวณเวลา แต่การแนะนำแพ็คเกจ java.time ทำให้ชีวิตดีขึ้นมาก ดูที่ java.time.LocalDate ที่มีค่าปีเดือนวันหรือ java.time.MonthDay ที่มีเพียงเดือนและจำนวนวัน


1

การจัดการกับดาวเรืองเป็นหนึ่งในด้านที่เข้าใจยากที่สุดของการคำนวณ มีการเขียนหนังสือทั้งเล่มในหัวข้อ @MichealBlackburn นั้นถูกต้องในการขอประเภทข้อมูลวันที่เท่านั้นซึ่งไม่สามารถแก้ไขได้ถึงจุดบนไทม์ไลน์อาจมีการตีความอีกครั้ง ในอดีตมีข้อพิพาทที่ถูกต้องตามกฎหมายเกี่ยวกับความหมายของวันที่ เราไม่ต้องมองหาสิ่งอื่นนอกจากการใช้ปฏิทินเกรกอเรียนเพื่อค้นหาว่ามันซับซ้อนแค่ไหน นอกจากนี้ปีไม่ได้เริ่มต้นเสมอในวันที่ 1 มกราคมแม้ในยุโรปตะวันตกและอาณานิคมของมัน ( เช่นอังกฤษและอเมริกาเริ่มต้นปีในวันที่ 25 มีนาคม)


1
ถูกต้องแล้ว คำถามที่พบบ่อยปฏิทินที่ฉันพูดในคำตอบของฉันเป็นทรัพยากรที่ยอดเยี่ยมในการค้นพบความซับซ้อนและ subtletie4s ของการจัดการ clandar
Michael Le Barbier Grünewald

-2

ในการตอบกลับ:

ฉันอยากรู้ว่าทำไมเกือบทุกภาษามีเพียงประเภทข้อมูลเดียวสำหรับเรื่องนี้

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

date = new DateTime(year, month, day, 0, 0, 0);

หากคุณต้องการคุณสามารถขยาย DateTime ด้วยตัวคุณเอง:

public class Date extends DateTime {
    ...
    public Date(int year, int month, int day) {
        this(year, month, day, 0, 0, 0);
    }
}

หมายเหตุ: ฉันตั้งใจละเว้นเวลาและเขตเวลาเริ่มต้น มันไม่ได้เรื่องจริงๆสิ่งที่คุณจะตั้งค่าให้ตราบใดที่พวกเขากำลังเหมือนกันทุกDateวินาที คุณสามารถสร้างเคสสำหรับ UTC ได้ คุณสามารถสร้างกรณีเพื่อใช้เขตเวลาที่เซิร์ฟเวอร์ของคุณตั้งอยู่ - ไม่ว่าฉันจะไม่คิดว่ามันเป็นสิ่งสำคัญสำหรับการแสดงค่าที่ไม่แม่นยำเช่นDateนั้น เช่นเดียวกันกับเวลาเริ่มต้น - คุณสามารถทำให้เป็น 0 คุณสามารถทำให้เป็นตอนเที่ยง มันไม่สำคัญ หาก Facebook ส่งการแจ้งเตือนวันเกิดให้ฉันในเวลา 00:01 น แต่ฉันเกิดที่ 23:59 ฉันไม่สนใจจริงๆและฉันจะไม่โกรธเคืองที่พวกเขาปิดมากกว่า 12 ชั่วโมง

ข้างต้นอยู่ใน Java แต่จะทำงานคล้าย ๆ กันในภาษาใด ๆ ที่มีDateTimeและมรดก Java มีวิธีการแก้ไขปัญหานี้มากมายจริง ๆ และข้างต้นถูกคัดค้าน (พวกเขาต้องการให้คุณใช้Calendarตอนนี้) แต่ในขณะที่คนอื่นโพสต์ในความคิดเห็นบางภาษาจริงทำให้Dateระดับสันนิษฐานว่าด้วยเหตุผลเพียงแค่นี้

ในทุกโอกาสDateการใช้งานทุกอย่างอาจเป็นเพียงเครื่องมือห่อหุ้มสำหรับภาษาDateTimeและทำให้เวลาเป็นศูนย์ มิฉะนั้นคุณจะต้องใช้รหัสซ้ำเพื่อแก้ปัญหาเช่นจำนวนวันระหว่างวันที่สองวัน / วันที่หรือว่าทั้งสองDateมีค่าเท่ากัน (ประมาณวันที่ 29 กุมภาพันธ์และ 1 มีนาคม) สิ่งเหล่านั้นมักจะถูกแก้ไขในDateTimeชั้นเรียน Dateมันทำให้ความรู้สึกที่จะนำมาใช้รหัสเดียวกันสำหรับ


4
-1: ใช้ LocalDate หากคุณต้องการเพียงแค่ปี + เดือน + วัน การใช้ DateTime เพื่อจุดประสงค์นั้นจะนำไปสู่ข้อผิดพลาดเมื่อโปรแกรมเมอร์อื่น ๆ เห็น DateTime และถือว่าเป็นช่วงเวลา
วินไคลน์

@ kevincline ฉันไม่รู้สึกว่าจำเป็นเพราะคำถามนี้ไม่เชื่อเรื่องภาษา ฉันคิดว่ามันชัดเจนว่าการใช้รหัสที่มีป้ายกำกับว่า "เลิกใช้แล้ว" เป็นสถานการณ์ที่มีความเสี่ยงในการใช้ของคุณเอง ที่สำคัญฉันเท่านั้นที่ใช้ที่เป็นตัวอย่างของสิ่งที่คุณสามารถทำได้ในสถานการณ์ที่การภาษาที่ไม่ได้มีLocalDateหรือDateประเภทชั้นและคุณจะต้องกลิ้งของคุณเอง '
Shaz

1
แต่ "จำเป็นต้องมี" สำหรับรหัสที่ชัดเจนและถูกต้องซึ่งเกี่ยวข้องกับกฎเกณฑ์ทางธุรกิจเกี่ยวกับเวลา (ตรงข้ามกับเวลาจริง) หากไลบรารี่ไม่ได้จัดประเภทไว้ตามเวลาที่กำหนดไว้มันจะจำเป็นสำหรับโปรแกรมเมอร์ที่จะประดิษฐ์มันขึ้นมาและวิธีการทำนั้นไม่ได้เริ่มต้นด้วย "DateTime"
วินไคลน์

@ kevincline ฉันไม่เห็นว่ารหัสจะชัดเจนน้อยลงหรือกระชับขึ้น อะไรคือความแตกต่างจากมุมมองของโปรแกรมเมอร์ระหว่างnew Date(2000, 1, 1);และnew Date(2000, 1, 1);? คุณสามารถบอกได้ว่าอันไหนมีชั่วโมงว่างนาทีและวินาทีข้างใต้? หากคุณกังวลเกี่ยวกับฟังก์ชั่นพิเศษที่แสดงขึ้น (เช่น setMinutes ()) คุณสามารถไปที่เส้นทางของการDateห่อDateTimeแทนการสืบทอดจากมันและจากนั้นคุณจะเปิดเผย setYear, setMonth, setDay เป็นต้นและแน่นอนว่าไม่น้อย ถูกต้องกว่า DateTime ของไลบรารีที่คุณใช้อยู่
Shaz

พื้นหลังของฉันส่วนใหญ่เป็น C # ซึ่งไม่มีโครงสร้างคล้ายกับ LocalDate เราเพียงแค่ DateTime และยุ่งเหยิงผ่านชัด
Michael Blackburn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.