ฉันอ่านเอกสารแล้ว แต่ฉันยังไม่สามารถรับได้เมื่อฉันควรใช้อย่างใดอย่างหนึ่ง:
ตามเอกสาร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 ฯลฯ จากสิ่งที่ฉันอ่าน