ZonedDateTime और OffsetDateTime में क्या अंतर है?


155

मैंने दस्तावेज़ीकरण पढ़ा है, लेकिन मुझे अभी भी नहीं मिल सकता है जब मुझे एक या दूसरे का उपयोग करना चाहिए:

OffsetDateTimeडेटाबेस के लिए तारीख लिखते समय प्रलेखन के अनुसार उपयोग किया जाना चाहिए, लेकिन मुझे ऐसा क्यों नहीं मिला।


4
मूल रूप से ZonedDateTimeभी टाइमज़ोन के बारे में जानकारी है, जिसमें डीएसटी स्विचिंग आदि से जो मैंने पढ़ा है।
फेज

जवाबों:


187

प्रश्न: जावा 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मान लगातार बने रहते हैं और बाद में उपयोग किए जाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.