ความแตกต่างระหว่าง ZonedDateTime และ OffsetDateTime คืออะไร


155

ฉันอ่านเอกสารแล้ว แต่ฉันยังไม่สามารถรับได้เมื่อฉันควรใช้อย่างใดอย่างหนึ่ง:

ตามเอกสารOffsetDateTimeควรใช้เมื่อเขียนวันที่ไปยังฐานข้อมูล แต่ฉันไม่เข้าใจสาเหตุ


4
โดยทั่วไปแล้วZonedDateTimeยังมีข้อมูลเกี่ยวกับเขตเวลารวมถึงการสลับ DST ฯลฯ จากสิ่งที่ฉันอ่าน
fge

คำตอบ:


187

ถาม: Java 8 ZonedDateTime และ OffsetDateTime แตกต่างกันอย่างไร

javadocs พูดสิ่งนี้:

" OffsetDateTime, ZonedDateTimeและInstantร้านค้าทั้งหมดทันทีในเวลาบรรทัดเพื่อความแม่นยำ nanosecond. Instantจะง่ายเพียงแค่เป็นตัวแทนทันที. OffsetDateTimeเพื่อเพิ่มทันทีชดเชยจาก UTC / กรีนวิชซึ่งจะช่วยให้วันเวลาท้องถิ่นที่จะได้รับ. ZonedDateTimeเพิ่มเต็มเวลา กฎของโซน "

ที่มา: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

ดังนั้นความแตกต่างระหว่างOffsetDateTimeและZonedDateTimeเป็นที่หลังรวมถึงกฎที่ครอบคลุมการปรับเวลาตามฤดูกาลและความผิดปกติอื่น ๆ อีกมากมาย

ระบุเพียง:

เขตเวลา = ( ออฟเซ็ตจาก UTC + กฎสำหรับความผิดปกติ)


ถาม: OffsetDateTimeควรใช้เอกสารอ้างอิงเมื่อเขียนวันที่ไปยังฐานข้อมูล แต่ฉันไม่เข้าใจสาเหตุ

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

  • มันสามารถเก็บออฟเซตที่คำนวณได้ ... และวัตถุที่ดึงมานั้นอาจมีออฟเซ็ตที่ไม่สอดคล้องกับกฎปัจจุบันสำหรับโซน -id

  • มันสามารถละทิ้งออฟเซ็ตที่คำนวณได้และจากนั้นวัตถุที่ดึงมาจะแสดงถึงจุดที่แตกต่างในไทม์ไลน์แบบสัมบูรณ์ / สากลมากกว่าที่ถูกเก็บไว้

หากคุณใช้การทำให้เป็นอันดับวัตถุ Java การใช้งาน Java 9 ใช้วิธีแรก นี่เป็นวิธีที่ "ถูกต้องมากกว่า" ในการจัดการกับสิ่งนี้ แต่ดูเหมือนจะไม่ได้รับการบันทึกไว้ (ไดรเวอร์ JDBC และการเชื่อมโยง ORM อาจเป็นการตัดสินใจที่คล้ายกันและหวังว่าจะทำให้ถูกต้อง)

แต่ถ้าคุณกำลังเขียนแอปพลิเคชันที่เก็บค่าวันที่ / เวลาด้วยตนเองหรือที่พึ่งพาjava.sql.DateTimeการจัดการกับความยุ่งยากของ zone-id คือ ... อาจเป็นสิ่งที่ควรหลีกเลี่ยง ดังนั้นคำแนะนำ

โปรดทราบว่าวันที่ซึ่งความหมาย / การสั่งซื้อไม่เสถียรเมื่อเวลาผ่านไปอาจเป็นปัญหาสำหรับแอปพลิเคชัน และเนื่องจากการเปลี่ยนแปลงกฎของโซนเป็นกรณีที่มีขอบปัญหาจะเกิดขึ้นในเวลาที่ไม่คาดคิด


เหตุผลที่สอง (เป็นไปได้) สำหรับคำแนะนำคือการสร้าง a ZonedDateTimeนั้นคลุมเครือในบางจุด ตัวอย่างเช่นในช่วงเวลาที่คุณ "ใส่นาฬิกากลับ" การรวมเวลาท้องถิ่นและรหัสโซนสามารถให้คุณชดเชยสองที่แตกต่างกัน ZonedDateTimeสม่ำเสมอจะเลือกหนึ่งในช่วงอื่น ๆ ... แต่นี้ไม่เสมอเลือกที่ถูกต้อง

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.