ฉันอ่านเอกสารแล้ว แต่ฉันยังไม่สามารถรับได้เมื่อฉันควรใช้อย่างใดอย่างหนึ่ง:
ตามเอกสารOffsetDateTimeควรใช้เมื่อเขียนวันที่ไปยังฐานข้อมูล แต่ฉันไม่เข้าใจสาเหตุ
ฉันอ่านเอกสารแล้ว แต่ฉันยังไม่สามารถรับได้เมื่อฉันควรใช้อย่างใดอย่างหนึ่ง:
ตามเอกสารOffsetDateTimeควรใช้เมื่อเขียนวันที่ไปยังฐานข้อมูล แต่ฉันไม่เข้าใจสาเหตุ
คำตอบ:
ถาม: 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ยังคงมีอยู่และใช้ในภายหลัง
ZonedDateTimeยังมีข้อมูลเกี่ยวกับเขตเวลารวมถึงการสลับ DST ฯลฯ จากสิ่งที่ฉันอ่าน