The AnswerAndreas द्वारा स्पॉट-ऑन सही है।
उदाहरण कोड
चलिए इसे कुछ कोड के साथ जांचें। DST in the United States & कनाडा 02:00 1 नवंबर को पर इस साल समाप्त हो रहा है, 2015
के "स्थानीय" तिथि-समय में 1 पूर्वाह्न साथ शुरू, समय से बंधा नहीं है जिसका अर्थ है और समय क्षेत्र के मुद्दे की अनदेखी करते हैं। एक घंटा जोड़ें, और हमें 2 बजे मिलते हैं। समझ में आता है।
LocalDateTime localDateTime = LocalDateTime.of(2015 , Month.NOVEMBER , 1 , 1 , 0); // 1 AM anywhere. Not tied the timeline nor to any time zone.
LocalDateTime localDateTimeOneHourLater = localDateTime.plusHours(1); // 2 AM anywhere, in no particular time zone, ignoring DST.
अगला हम एक विशेष समय क्षेत्र के साथ विशिष्ट प्राप्त करते हैं।हम इसे 1 बजे कहीं भी लेते हैं और इसे America/Los_Angeles
(संयुक्त राज्य अमेरिका के पश्चिमी तट) के समय क्षेत्र में डाल देते हैं।
ZoneId zoneId_LosAngeles = ZoneId.of("America/Los_Angeles");
ZonedDateTime before = localDateTime.atZone(zoneId_LosAngeles); // Assign a time zone, tying this vague date-time idea/generality to an actual moment on the time line.
अब एक घंटा जोड़ें, और देखें कि हमें क्या मिलता है। अगर डीएसटी को नजरअंदाज कर दिया जाता है, तो हमें 2 बजे मिलेगा। यदि डीएसटी का सम्मान किया जाता है, तो हमें 1 बजे मिलेगा ... 2 पूर्वाह्न तक पहुंचने पर wall-clock time 1 बजे वापस कूदता है लेकिन एक नए ऑफ़सेट-यूटीसी के साथ। यह गिरावट (शरद ऋतु) में "fall back" के रूप में जाना जाता है।
ZonedDateTime after = before.plusHours(1); // 2 AM? Nope, 1 AM because DST Daylight Saving Time expires at 2 AM Nov 1, 2015.
कंसोल पर डंप करें।
System.out.println("localDateTime : " + localDateTime);
System.out.println("localDateTimeOneHourLater : " + localDateTimeOneHourLater);
System.out.println("before : " + before);
System.out.println("after : " + after);
रन करते समय, हमें यह आउटपुट मिलता है। एक समय क्षेत्र के बिना, 1 पूर्वाह्न + 1 घंटा = 2 पूर्वाह्न। याद रखें ये "स्थानीय" दिनांक-समय मान हैं, यूटीसी नहीं। वे समय-समय पर वास्तविक क्षण नहीं, डेट-टाइम के केवल अस्पष्ट विचार का प्रतिनिधित्व करते हैं।
localDateTime : 2015-11-01T01:00
localDateTimeOneHourLater : 2015-11-01T02:00
लेकिन डीएसटी की अवधि समाप्त होने पर समय क्षेत्र लागू होने के साथ, हमें अलग-अलग परिणाम मिलते हैं। ध्यान दें कि समय-समय पर 01:00
रहता है लेकिन offset-from-UTC-07:00
से -08:00
में परिवर्तन करता है।
before : 2015-11-01T01:00-07:00[America/Los_Angeles]
after : 2015-11-01T01:00-08:00[America/Los_Angeles]
शायद यह यूटीसी में समायोजित करने के लिए सत्यापित करने के लिए और अधिक स्पष्ट और आसान होगा। हम before
और after
ऑब्जेक्ट्स Instant
ऑब्जेक्ट्स के रूप में एक्सेस करके बस ऐसा कर सकते हैं। System.out.println
तो तत्काल toString
विधि को कॉल करता है।
System.out.println("before.toInstant : " + before.toInstant());
System.out.println("after.toInstant : " + after.toInstant());
रन करते समय।
before.toInstant : 2015-11-01T08:00:00Z
after.toInstant : 2015-11-01T09:00:00Z
संक्षेप में: हाँ, डीएसटी का ख्याल रखा जाता है। जावा 8 डेट-टाइम एपीआई जोडा समय के आधार पर बनाया गया था। –
@ राजा मैं भ्रम को रोकने के लिए आपकी शर्तों को सही कर दूंगा ... "स्थानीय" किसी भी इलाके के लिए "स्थानीय" का मतलब है, "क्रिसमस 25 दिसंबर 2015 को मध्यरात्रि में शुरू होता है"। इस तरह के स्थानीय दिनांक-समय में कोई समय क्षेत्र नहीं है। दरअसल, इसका कोई वास्तविक अर्थ नहीं है जब तक कि आप इसे किसी विशिष्ट समय क्षेत्र में समायोजित न करें। 25 वीं को आधी रात मॉन्ट्रियल की तुलना में पेरिस में पहले आती है। इसलिए, सामान्य व्यापार ऐप्स में हम शायद ही कभी "स्थानीय" का उपयोग करते हैं। आप अपने संग्रहीत दिनांक-समय मानों को अपने डेटाबेस से ले जायेंगे, आम तौर पर यूटीसी में अपने व्यावसायिक तर्क में उनके साथ काम कर रहे हैं, और केवल उपयोगकर्ता को प्रस्तुति के लिए 'ZonedDateTime' में समायोजित करेंगे। –