मैंने दस्तावेज़ीकरण पढ़ा है, लेकिन मुझे अभी भी नहीं मिल सकता है जब मुझे एक या दूसरे का उपयोग करना चाहिए:
OffsetDateTime
डेटाबेस के लिए तारीख लिखते समय प्रलेखन के अनुसार उपयोग किया जाना चाहिए, लेकिन मुझे ऐसा क्यों नहीं मिला।
मैंने दस्तावेज़ीकरण पढ़ा है, लेकिन मुझे अभी भी नहीं मिल सकता है जब मुझे एक या दूसरे का उपयोग करना चाहिए:
OffsetDateTime
डेटाबेस के लिए तारीख लिखते समय प्रलेखन के अनुसार उपयोग किया जाना चाहिए, लेकिन मुझे ऐसा क्यों नहीं मिला।
जवाबों:
प्रश्न: जावा 8 ZonedDateTime और OffsetDateTime में क्या अंतर है?
Javadocs यह कहते हैं:
"
OffsetDateTime
,ZonedDateTime
औरInstant
सभी एक लाइन को टाइम-लाइन पर नैनो-सेकंड सटीक में स्टोर करते हैं।Instant
यह सबसे सरल है, बस तत्काल का प्रतिनिधित्व करता है।OffsetDateTime
तत्काल को यूटीसी / ग्रीनविच से ऑफसेट जोड़ता है, जो स्थानीय तिथि-समय प्राप्त करने की अनुमति देता है।ZonedDateTime
पूर्ण जोड़ता है । -अजोन नियम। "
स्रोत: https://docs.oracle.com/javase/8/docs/api/java/time/Offset.ateTime.html
इस प्रकार अंतर OffsetDateTime
और ZonedDateTime
यह है कि उत्तरार्द्ध में दिन के समय की बचत और समायोजन और अन्य विसंगतियों को कवर करने वाले नियम शामिल हैं।
बस कहा:
समय क्षेत्र = ( ऑफसेट-से-यूटीसी + नियम-के लिए विसंगतियाँ)
प्रश्न: दस्तावेज़ के अनुसार
OffsetDateTime
डेटाबेस को तारीख लिखते समय उपयोग किया जाना चाहिए, लेकिन मुझे ऐसा क्यों नहीं मिलता है।
स्थानीय समय के साथ डेट्स हमेशा समय में एक ही उदाहरण का प्रतिनिधित्व करते हैं, और इसलिए एक स्थिर क्रम है। इसके विपरीत, पूर्ण टाइमज़ोन जानकारी के साथ तारीखों का अर्थ संबंधित टाइमज़ोन के नियमों के समायोजन के सामने अस्थिर है। (और ये होता है; उदाहरण के लिए भविष्य में तारीख-समय के मूल्य।) इसलिए यदि आप स्टोर करते हैं और फिर ZonedDateTime
कार्यान्वयन को पुनः प्राप्त करते हैं तो समस्या होती है:
यह गणना की गई ऑफसेट को संग्रहीत कर सकता है ... और पुनर्प्राप्त वस्तु में एक ऑफसेट हो सकता है जो ज़ोन-आईडी के लिए वर्तमान नियमों के साथ असंगत है।
यह गणना की गई ऑफसेट को छोड़ सकता है ... और पुनर्प्राप्त वस्तु तब संग्रहीत किए गए की तुलना में पूर्ण / सार्वभौमिक समयरेखा में एक अलग बिंदु का प्रतिनिधित्व करती है।
यदि आप जावा ऑब्जेक्ट क्रमांकन का उपयोग करते हैं, तो जावा 9 कार्यान्वयन पहला दृष्टिकोण लेता है। यह यकीनन इसे संभालने का "अधिक सही" तरीका है, लेकिन यह प्रलेखित नहीं है। (JDBC ड्राइवर और ORM बाइंडिंग संभवतः समान निर्णय ले रहे हैं, और उम्मीद है कि यह सही हो रहा है।)
लेकिन अगर आप एक ऐसा एप्लिकेशन लिख रहे हैं जो मैन्युअल रूप से दिनांक / समय मानों को संग्रहीत करता है, या जो पर निर्भर करता है java.sql.DateTime
, तो ज़ोन-आईडी की जटिलताओं से निपटना है ... शायद कुछ से बचा जाए। इसलिए सलाह।
ध्यान दें कि जिन तिथियों का अर्थ / आदेश समय के साथ अस्थिर है, वे किसी अनुप्रयोग के लिए समस्याग्रस्त हो सकते हैं । और चूंकि ज़ोन नियमों में बदलाव एक किनारे का मामला है, इसलिए समस्याएँ अप्रत्याशित समय पर उभरने के लिए उत्तरदायी हैं।
सलाह के लिए एक (संभव) दूसरा कारण यह है कि एक का निर्माण ZonedDateTime
कुछ बिंदुओं पर अस्पष्ट है। उदाहरण के लिए समय में जब आप "घड़ियों को वापस रख रहे हैं", एक स्थानीय समय और ज़ोन-आईडी के संयोजन से आपको दो अलग-अलग ऑफ़सेट मिल सकते हैं। ZonedDateTime
लगातार एक दूसरे के ऊपर ले जाएगा ... लेकिन यह हमेशा सही विकल्प नहीं है।
अब, यह उन अनुप्रयोगों के लिए एक समस्या हो सकती है जो इस ZonedDateTime
तरह से मूल्यों का निर्माण करते हैं। लेकिन किसी के लिए एक उद्यम अनुप्रयोग के निर्माण के दृष्टिकोण से एक बड़ी समस्या है जब (संभवतः गलत) ZonedDateTime
मान लगातार बने रहते हैं और बाद में उपयोग किए जाते हैं।
ZonedDateTime
भी टाइमज़ोन के बारे में जानकारी है, जिसमें डीएसटी स्विचिंग आदि से जो मैंने पढ़ा है।