2015-09-29 8 views
9

मैं नए जावा 8 दिनांक समय API का उपयोग करने के बारे में सोच रहा हूं। मैंने थोड़ी गड़बड़ी की और jodaTime को जावा के लिए अच्छी पसंद के रूप में पाया लेकिन फिर भी यह देखने में दिलचस्पी है कि यह नया एपीआई कैसे काम करता है।क्या जावा 8 का नया जावा डेट टाइम एपीआई डीएसटी का ख्याल रखता है?

मैं अपने डेटास्टोर में यूटीसी मूल्यों में हर समय संग्रहीत कर रहा हूं और उन्हें उपयोगकर्ता के टाइमज़ोन के आधार पर स्थानीय समय क्षेत्र विशिष्ट मान में परिवर्तित कर दूंगा। मैं नए जावा डेट टाइम एपीआई का उपयोग करने के तरीके को दिखाते हुए कई लेख पा सकते हैं। हालांकि मुझे यकीन नहीं है कि क्या एपीआई डीएसटी परिवर्तनों का ख्याल रखेगा? या क्या हमारे पास तिथि संभालने का कोई बेहतर तरीका है?

मैं सिर्फ नई डेट एपीआई सीख रहा हूं, इसलिए डेटटाइम को संभालने और इसे उपयोगकर्ता टाइमज़ोन के आधार पर प्रदर्शित करने के बारे में सोचा।

+3

संक्षेप में: हाँ, डीएसटी का ख्याल रखा जाता है। जावा 8 डेट-टाइम एपीआई जोडा समय के आधार पर बनाया गया था। –

+1

@ राजा मैं भ्रम को रोकने के लिए आपकी शर्तों को सही कर दूंगा ... "स्थानीय" किसी भी इलाके के लिए "स्थानीय" का मतलब है, "क्रिसमस 25 दिसंबर 2015 को मध्यरात्रि में शुरू होता है"। इस तरह के स्थानीय दिनांक-समय में कोई समय क्षेत्र नहीं है। दरअसल, इसका कोई वास्तविक अर्थ नहीं है जब तक कि आप इसे किसी विशिष्ट समय क्षेत्र में समायोजित न करें। 25 वीं को आधी रात मॉन्ट्रियल की तुलना में पेरिस में पहले आती है। इसलिए, सामान्य व्यापार ऐप्स में हम शायद ही कभी "स्थानीय" का उपयोग करते हैं। आप अपने संग्रहीत दिनांक-समय मानों को अपने डेटाबेस से ले जायेंगे, आम तौर पर यूटीसी में अपने व्यावसायिक तर्क में उनके साथ काम कर रहे हैं, और केवल उपयोगकर्ता को प्रस्तुति के लिए 'ZonedDateTime' में समायोजित करेंगे। –

उत्तर

15

यह कौन सी क्लास y पर निर्भर करता है कहां का उपयोग करें:

  • Instant वैश्विक समय-रेखा (UTC) पर एक तात्कालिक बिंदु है, और समय-क्षेत्र से संबंधित नहीं है।
  • LocalDate और LocalDateTime में समय-क्षेत्र की कोई अवधारणा नहीं है, लेकिन now() पर कॉल करने से आपको अपना सही समय मिल जाएगा।
  • OffsetDateTime में समय-क्षेत्र है, लेकिन डेलाइट सेविंग टाइम का समर्थन नहीं करता है।
  • ZonedDateTime में पूर्णकालिक-क्षेत्र समर्थन है।

उन दोनों के बीच परिवर्तित आम तौर पर एक समय-क्षेत्र की आवश्यकता है, इसलिए आपके सवाल का जवाब देना:

        हाँ, जावा 8 दिनांक/समय डीएसटी की देखभाल, ले जा सकते हैं अगर आप का उपयोग यह सही।

+0

उल्लेख करने के लिए धन्यवाद कि 'ऑफ़सेटडेट टाइम' डीएसटी का समर्थन नहीं करता है, यही वही है जो मुझे चाहिए, धन्यवाद! –

3

हां, जावा एपीआई डीएसटी परिवर्तनों को ध्यान में रखेगा।

इस ट्यूटोरियल काफी अच्छी तरह से बताते हैं कि कैसे कैसे एक तिथि का प्रतिनिधित्व करने के लिए सही वर्ग का चयन करने के समय क्षेत्र के बीच तारीखों कन्वर्ट करने के लिए: https://docs.oracle.com/javase/tutorial/datetime/iso/timezones.html

तुम भी इस वर्ग के जो प्रत्येक क्षेत्र के लिए नियमों का प्रतिनिधित्व करता है देख सकते हैं: http://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRules.html

विशेष रूप से, इस प्रक्रिया में बता सकते हैं कि एक खास पल डेलाइट सेविंग में है: http://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRules.html#isDaylightSavings-java.time.Instant-

+0

Orcale दस्तावेज़ों के मूल्य को याद दिलाने के लिए धन्यवाद :) वे लिंक मेरे लिए अधिक उपयोगी हैं। – Raja

14

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 
संबंधित मुद्दे