LocalDateTime के साथ दिनांक / स्वरूप कैसे पार्स करें? (जावा 8)


341

Java 8 ने दिनांक और समय ( JSR 310 ) के साथ काम करने के लिए एक नया java.time API जोड़ा ।

मेरे पास तारीख और समय स्ट्रिंग (जैसे "2014-04-08 12:30") है। मैं LocalDateTimeदिए गए स्ट्रिंग से एक उदाहरण कैसे प्राप्त कर सकता हूं ?

जब मैं LocalDateTimeऑब्जेक्ट के साथ काम करना समाप्त कर लेता हूं : तो मैं कैसे LocalDateTimeउदाहरण को वापस उसी स्ट्रिंग के साथ स्ट्रिंग में परिवर्तित कर सकता हूं जैसा कि ऊपर दिखाया गया है?


11
FYI करें, ज्यादातर लोग ज्यादातर समय एक के ZonedDateTimeबजाय चाहते हैं LocalDateTime। नाम प्रति-सहज है; एक विशिष्ट समय क्षेत्र के बजाय सामान्य रूप से किसी भी इलाके का Localमतलब है । जैसे, किसी वस्तु को समय रेखा से नहीं बांधा जाता है। अर्थ के लिए, समय रेखा पर एक निर्दिष्ट क्षण प्राप्त करने के लिए, आपको एक समय क्षेत्र लागू करना चाहिए। LocalDateTime
बेसिल बोर्क

के लिए स्पष्टीकरण मेरा उत्तर देखें LocalDateTimeबनाम ZonedDateTimeबनाम OffsetDateTimeबनाम Instantबनाम LocalDateबनाम LocalTime, कैसे कारण है कि यह इतना जटिल और कैसे यह सही पहली गोली में क्या करना है के बारे में शांत रखने के लिए।
ओन्द्रा žižka

1
यदि यह अव्यवहारिक रूप से लंबा नहीं LocalDateTimeहोता , तो शायद इसका नाम होता ZonelessOffsetlessDateTime
ओन्ड्रा žयूका

जवाबों:


534

पार्सिंग तिथि और समय

LocalDateTimeकिसी स्ट्रिंग से ऑब्जेक्ट बनाने के लिए आप स्टैटिक LocalDateTime.parse()विधि का उपयोग कर सकते हैं । यह एक स्ट्रिंग और एक DateTimeFormatterपैरामीटर के रूप में लेता है । DateTimeFormatterदिनांक / समय पैटर्न निर्दिष्ट करने के लिए प्रयोग किया जाता है।

String str = "1986-04-08 12:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);

स्वरूपण दिनांक और समय

किसी LocalDateTimeऑब्जेक्ट को एक स्वरूपित स्ट्रिंग बनाने के लिए आप format()विधि का उपयोग कर सकते हैं ।

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30);
String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30"

ध्यान दें कि कुछ सामान्य रूप से उपयोग की जाने वाली तारीखें / समय प्रारूप हैं जो कि स्थिरांक के रूप में पूर्वनिर्धारित हैं DateTimeFormatter। उदाहरण के लिए: ऊपर से उदाहरण DateTimeFormatter.ISO_DATE_TIMEस्वरूपित करने LocalDateTimeसे स्ट्रिंग में परिणाम होगा "1986-04-08T12:30:00"

parse()और format()(जैसे तरीकों सभी दिनांक / समय संबंधित वस्तुओं के लिए उपलब्ध हैं LocalDateया ZonedDateTime)


77
बस ध्यान दें कि DateTimeFormatter अपरिवर्तनीय और थ्रेड-सुरक्षित है, और इस प्रकार अनुशंसित दृष्टिकोण इसे स्थिर स्थिर में संग्रहीत करना है।
JodaStephen

@micha क्या होगा अगर मेरे पास "2016-12-31T07: 59: 00.000Z" यह तिथि है?
दाऊद अहमद

14
@DawoodAbbasi कोशिशDateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")
रे हुलहा

1
@ फोनिक्स शायद ऐसा इसलिए है क्योंकि आप format()उदाहरण के बजाय लोकलडेटाइम क्लास पर कॉल करने की कोशिश कर रहे हैं ? कम से कम, कि मैं क्या किया: मैं उलझन DateTimeके साथ dateTimeऊपर के उदाहरण में।
glaed


159

तुम भी उपयोग कर सकते हैं LocalDate.parse()या LocalDateTime.parse()एक पर Stringएक पैटर्न के साथ यह प्रदान किए बिना, अगर Stringमें है आईएसओ 8601 प्रारूप

उदाहरण के लिए,

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
System.out.println("Date: " + aLD);

String strDatewithTime = "2015-08-04T10:11:30";
LocalDateTime aLDT = LocalDateTime.parse(strDatewithTime);
System.out.println("Date with Time: " + aLDT);

आउटपुट ,

Date: 2015-08-04
Date with Time: 2015-08-04T10:11:30

और DateTimeFormatterकेवल तभी उपयोग करें जब आपको अन्य तारीख पैटर्न से निपटना पड़े।

उदाहरण के लिए, निम्नलिखित उदाहरण में, dd MMM uuuu महीने के दिन (दो अंक), महीने के नाम के तीन अक्षर (जनवरी, फरवरी, मार्च, ...) और चार अंकों वाला वर्ष दर्शाता है:

DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu");
String anotherDate = "04 Aug 2015";
LocalDate lds = LocalDate.parse(anotherDate, dTF);
System.out.println(anotherDate + " parses to " + lds);

उत्पादन

04 Aug 2015 parses to 2015-08-04

यह भी याद रखें कि DateTimeFormatterवस्तु द्विदिश है; यह इनपुट और फॉर्मेट आउटपुट दोनों को पार्स कर सकता है।

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu");
System.out.println(aLD + " formats as " + dTF.format(aLD));

उत्पादन

2015-08-04 formats as 04 Aug 2015

( फॉर्मेटिंग और पार्सिंग डेटफार्मेट के लिए पैटर्न की पूरी सूची देखें )

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   G       era                         text              AD; Anno Domini; A
   u       year                        year              2004; 04
   y       year-of-era                 year              2004; 04
   D       day-of-year                 number            189
   M/L     month-of-year               number/text       7; 07; Jul; July; J
   d       day-of-month                number            10

   Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
   Y       week-based-year             year              1996; 96
   w       week-of-week-based-year     number            27
   W       week-of-month               number            4
   E       day-of-week                 text              Tue; Tuesday; T
   e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
   F       week-of-month               number            3

   a       am-pm-of-day                text              PM
   h       clock-hour-of-am-pm (1-12)  number            12
   K       hour-of-am-pm (0-11)        number            0
   k       clock-hour-of-am-pm (1-24)  number            0

   H       hour-of-day (0-23)          number            0
   m       minute-of-hour              number            30
   s       second-of-minute            number            55
   S       fraction-of-second          fraction          978
   A       milli-of-day                number            1234
   n       nano-of-second              number            987654321
   N       nano-of-day                 number            1234000000

   V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
   z       time-zone name              zone-name         Pacific Standard Time; PST
   O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
   X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
   x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
   Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

   p       pad next                    pad modifier      1

   '       escape for text             delimiter
   ''      single quote                literal           '
   [       optional section start
   ]       optional section end
   #       reserved for future use
   {       reserved for future use
   }       reserved for future use

11
यह उत्तर एक महत्वपूर्ण विषय पर छुआ है: पूर्वनिर्धारित फ़ॉर्मेटर्स का उपयोग करें जहाँ भी संभव हो जैसे कि "yyyy-MM-dd" पर एक फ़ॉर्मेटर बेस बनाएँ, इसके बजाय DateTimeFormatter.ISO_LOCAL_DATE का उपयोग करें। यह आपके कोड को पूरी तरह से क्लीनर बना देगा। इसके अलावा, ISO8061 प्रारूप के उपयोग को अधिकतम करने का प्रयास करें, यह लंबे समय में लाभांश का भुगतान करेगा।
क्रिस्टोफर यांग

मैं सत्यापन के लिए एक तारीख को पार्स करना चाहता हूं 2018-08-09 12:00:08लेकिन जब मैं पार्स करता हूं तो मुझे एक Tजोड़ा जाता है जिसकी मुझे आवश्यकता नहीं है। क्या इसे करने का कोई तरीका है ?
रघुवीर

@ रघुवीर द टी सिर्फ तारीख और समय के बीच आईएसओ -8061 परिसीमन है। यदि आपके पास इसके प्रारूप में जगह है, तो आप बस yyyy-MM-dd hh:mm:ssपार्सिंग और स्वरूपण के लिए पैटर्न का उपयोग कर सकते हैं । T हमेशा डिफ़ॉल्ट (ISO-8061) प्रारूप में दिखाई देगा, लेकिन आप अपने स्वयं के पैटर्न का उपयोग कर सकते हैं।
ईगोर हंस

39

ऊपर दिए गए दोनों उत्तर स्ट्रिंग पैटर्न के बारे में बहुत अच्छी तरह से सवाल समझाते हैं। हालाँकि, अगर आप आईएसओ 8601 के साथ काम कर रहे हैं, तो आवेदन करने की कोई आवश्यकता नहीं है DateTimeFormatterक्योंकि लोकलडेट टाइम इसके लिए पहले से ही तैयार है:

Convert LocalDateTime को समय क्षेत्र ISO8601 स्ट्रिंग

LocalDateTime ldt = LocalDateTime.now(); 
ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC); //you might use a different zone
String iso8601 = zdt.toString();

ISO8601 स्ट्रिंग से वापस लोकल डेटाइम में कनवर्ट करें

String iso8601 = "2016-02-14T18:32:04.150Z";
ZonedDateTime zdt = ZonedDateTime.parse(iso8601);
LocalDateTime ldt = zdt.toLocalDateTime();

20

किसी स्ट्रिंग को दिनांक और समय के साथ एक विशेष बिंदु में पार्स करना (जावा इसे एक " Instant" कहता है ) काफी जटिल है। जावा कई पुनरावृत्तियों में इससे निपट रहा है। नवीनतम एक, java.timeऔर java.time.chrono, लगभग सभी जरूरतों को शामिल करता है ( टाइम डिलिशन :) को छोड़कर )।

हालांकि, यह जटिलता बहुत भ्रम पैदा करती है।

दिनांक पार्सिंग को समझने की कुंजी है:

किसी तिथि को पार्स करने के लिए जावा के पास इतने सारे तरीके क्यों हैं

  1. एक समय को मापने के लिए कई प्रणालियाँ हैं। उदाहरण के लिए, ऐतिहासिक जापानी कैलेंडर संबंधित सम्राट या राजवंश के शासनकाल के समय से प्राप्त हुए थे। फिर उदाहरण के लिए UNIX टाइमस्टैम्प है। सौभाग्य से, पूरी (व्यावसायिक) दुनिया उसी का उपयोग करने में कामयाब रही।
  2. ऐतिहासिक रूप से, विभिन्न कारणों से सिस्टम को / से स्विच किया जा रहा था । 1582 में जूलियन कैलेंडर से ग्रेगोरियन कैलेंडर तक। इसलिए इससे पहले 'पश्चिमी' तारीखों को अलग तरह से व्यवहार करने की आवश्यकता है।
  3. और निश्चित रूप से परिवर्तन एक बार में नहीं हुआ। क्योंकि कैलेंडर कुछ धर्मों के मुख्यालय से आया था और यूरोप के अन्य हिस्सों में अन्य आहारों पर विश्वास किया गया था, उदाहरण के लिए जर्मनी वर्ष 1700 तक स्विच नहीं करता था।

... और क्यों LocalDateTime, ZonedDateTimeएट अल है। बहुत कठिन

  1. कर रहे हैं समय क्षेत्र । एक समय क्षेत्र मूल रूप से पृथ्वी की सतह का एक "स्ट्राइप" * [1] है, जिसके अधिकारी उसी समय के नियमों का पालन करते हैं जब उसमें समय की भरपाई होती है। इसमें समर टाइम के नियम भी शामिल हैं।
    समय क्षेत्र विभिन्न क्षेत्रों के लिए समय के साथ बदलते हैं, ज्यादातर इस बात पर आधारित होते हैं कि कौन किस पर विजय प्राप्त करता है। और एक समय क्षेत्र के नियम समय के साथ-साथ बदलते हैं

  2. टाइम ऑफसेट हैं। यह समय क्षेत्र के समान नहीं है, क्योंकि एक समय क्षेत्र उदा "प्राग" हो सकता है, लेकिन इसमें समर टाइम ऑफसेट और विंटर टाइम ऑफसेट है।
    यदि आपको टाइम ज़ोन के साथ टाइमस्टैम्प मिलता है, तो ऑफसेट अलग-अलग हो सकता है, यह उस वर्ष के किस हिस्से पर निर्भर करता है। लीप ऑवर के दौरान टाइमस्टैम्प का मतलब 2 अलग-अलग समय हो सकता है, इसलिए अतिरिक्त जानकारी के बिना, यह मज़बूती से नहीं हो सकता है। बदल दिया।
    नोट: टाइमस्टैम्प से मेरा मतलब है "एक स्ट्रिंग जिसमें एक दिनांक और / या समय होता है, वैकल्पिक रूप से एक समय क्षेत्र और / या ऑफसेट के साथ।"

  3. कई समय क्षेत्र निश्चित अवधि के लिए समान समय ऑफसेट साझा कर सकते हैं। उदाहरण के लिए, GMT / UTC टाइम ज़ोन "लंदन" टाइम ज़ोन के समान है, जब ग्रीष्मकालीन समय ऑफसेट प्रभाव में नहीं होता है।

इसे थोड़ा और जटिल बनाने के लिए (लेकिन यह आपके उपयोग के मामले के लिए बहुत महत्वपूर्ण नहीं है):

  1. वैज्ञानिक पृथ्वी के गतिशील का निरीक्षण करते हैं, जो समय के साथ बदलता है; उसके आधार पर, वे व्यक्तिगत वर्षों के अंत में सेकंड जोड़ते हैं। (तो 2040-12-31 24:00:00एक मान्य दिनांक-समय हो सकता है।) यह मेटाडेटा के नियमित अपडेट की आवश्यकता है जो सिस्टम का उपयोग दिनांक रूपांतरणों को सही करने के लिए करता है। जैसे कि लिनक्स पर, आपको इन नए डेटा सहित जावा पैकेजों के नियमित अपडेट मिलते हैं।
  2. अद्यतन हमेशा ऐतिहासिक और भविष्य के टाइमस्टैम्प दोनों के लिए पिछले व्यवहार को नहीं रखते हैं। तो यह हो सकता है कि कुछ समय क्षेत्र के बदलाव के आसपास दो टाइमस्टैम्प्स की पार्सिंग करना सॉफ्टवेयर के विभिन्न संस्करणों पर चलने पर अलग- अलग परिणाम दे सकता है । यह प्रभावित समय क्षेत्र और अन्य समय क्षेत्र के बीच तुलना करने के लिए भी लागू होता है।

    क्या यह आपके सॉफ़्टवेयर में बग पैदा कर सकता है, कुछ टाइमस्टैम्प का उपयोग करने पर विचार करें, जिसमें इस तरह के जटिल नियम नहीं हैं, जैसे UNIX टाइमस्टैम्प

  3. भविष्य की तारीखों के लिए 7 की वजह से, हम निश्चितता के साथ तारीखों को परिवर्तित नहीं कर सकते हैं। इसलिए, उदाहरण के लिए, वर्तमान पार्सिंग 8524-02-17 12:00:00भविष्य के पार्सिंग से कुछ सेकंड का हो सकता है।

इसके लिए JDK की एपीआई समकालीन जरूरतों के साथ विकसित हुई

  • प्रारंभिक जावा रिलीज़ में बस java.util.Dateथोड़ा सा अनुभव था, यह मानते हुए कि अभी साल, महीना, दिन और समय है। यह जल्दी नहीं हुआ।
  • इसके अलावा, डेटाबेस की जरूरतें अलग थीं, इसलिए यह बहुत शुरुआती java.sql.Dateथी, इसकी अपनी सीमाएँ थीं।
  • क्योंकि न तो विभिन्न कैलेंडर और समय क्षेत्रों को अच्छी तरह से कवर किया Calendarगया था , इसलिए एपीआई पेश किया गया था।
  • यह अभी भी समय क्षेत्र की जटिलता को कवर नहीं करता था। और फिर भी, उपरोक्त एपीआई का मिश्रण वास्तव में काम करने के लिए एक दर्द था। इसलिए जैसे ही जावा डेवलपर्स ने वैश्विक वेब अनुप्रयोगों पर काम करना शुरू किया, पुस्तकालयों ने सबसे अधिक उपयोग के मामलों को लक्षित किया, जैसे कि JodaTime, जल्दी से लोकप्रिय हो गया। JodaTime लगभग एक दशक के लिए वास्तविक मानक था।
  • लेकिन JDK ने JodaTime के साथ एकीकरण नहीं किया, इसलिए इसके साथ काम करना थोड़ा बोझिल था। इसलिए, इस मामले पर संपर्क करने के तरीके पर बहुत लंबी चर्चा के बाद, मुख्य रूप से JodaTime पर आधारित JSR-310 बनाया गया ।

जावा में इससे कैसे निपटें java.time

निर्धारित करें कि किस टाइमस्टैम्प को पार्स करना है

जब आप टाइमस्टैम्प स्ट्रिंग का उपभोग कर रहे हैं, तो आपको यह जानना होगा कि इसमें क्या जानकारी है। यह महत्वपूर्ण बिंदु है। यदि आपको यह अधिकार नहीं मिलता है, तो आप एक गुप्त अपवाद को समाप्त करते हैं जैसे "तत्काल नहीं बना सकते" या "ज़ोन ऑफ़सेट मिसिंग" या "अज्ञात ज़ोन आईडी" आदि।

क्या इसमें तारीख और समय समाहित है?

  1. क्या यह एक समय ऑफसेट है?
    एक समय ऑफसेट +hh:mmहिस्सा है। कभी-कभी, यूनिवर्सल टाइम कोऑर्डिनेट या ग्रीनविच मीन टाइम के रूप में 'ज़ुलु समय' के रूप में +00:00प्रतिस्थापित किया जा सकता है । ये समय क्षेत्र भी निर्धारित करते हैं। इन टाइमस्टैम्प के लिए, आप उपयोग करते हैं ।ZUTCGMT
    OffsetDateTime

  2. क्या इसका कोई समय क्षेत्र है?
    इन टाइमस्टैम्प के लिए, आप उपयोग करते हैं ZonedDateTime
    ज़ोन या तो द्वारा निर्दिष्ट किया गया है

    • नाम ("प्राग", "प्रशांत मानक समय", "पीएसटी"), या
    • "ज़ोन आईडी" ("अमेरिका / लॉस_अंगेल्स", "यूरोप / लंदन"), java.time.ZoneId द्वारा दर्शाया गया है

    टाइम ज़ोन की सूची एक "TZ डेटाबेस" द्वारा संकलित है , जिसे ICAAN द्वारा समर्थित किया गया है।

    ZoneIdजेवाडॉक के अनुसार , ज़ोन आईडी को किसी तरह Zऔर ऑफसेट के रूप में भी निर्दिष्ट किया जा सकता है । मुझे यकीन नहीं है कि यह नक्शे वास्तविक क्षेत्रों में कैसे हैं। यदि टाइमस्टैम्प, जिसमें केवल एक टीबी है, एक घंटे के अंतराल में बदल जाता है, तो यह अस्पष्ट है, और व्याख्या का विषय है ResolverStyle, नीचे देखें।

  3. यदि यह न तो है, तो लापता संदर्भ ग्रहण या उपेक्षित है। और उपभोक्ता को तय करना होगा। तो यह रूप में पार्स करने की आवश्यकता है LocalDateTimeऔर परिवर्तित करने के लिए OffsetDateTimeयाद आ रही जानकारी जोड़कर:

    • आप मान सकते हैं कि यह यूटीसी का समय है। 0 घंटे के यूटीसी ऑफसेट जोड़ें।
    • आप मान सकते हैं कि यह उस स्थान का एक समय है जहां रूपांतरण हो रहा है। सिस्टम के समय क्षेत्र को जोड़कर इसे रूपांतरित करें।
    • आप उपेक्षा कर सकते हैं और बस इसका उपयोग कर सकते हैं । यह दो बार (देखें Duration) की तुलना या प्रतिस्थापित करने के लिए उदाहरण के लिए उपयोगी है , या जब आप नहीं जानते हैं और यह वास्तव में मायने नहीं रखता है (जैसे स्थानीय बस अनुसूची)।

आंशिक समय की जानकारी

  • क्या टाइमस्टैम्प शामिल आधार पर, आप ले जा सकते हैं LocalDate, LocalTime, OffsetTime, MonthDay, Year, या YearMonthइसे से बाहर।

यदि आपके पास पूरी जानकारी है, तो आप ए java.time.Instant। यह आंतरिक रूप से OffsetDateTimeऔर के बीच कनवर्ट करने के लिए भी उपयोग किया जाता है ZonedDateTime

इसे पार्स करने का तरीका जानें

एक व्यापक प्रलेखन है, DateTimeFormatterजिस पर दोनों टाइमस्टैम्प स्ट्रिंग और स्ट्रिंग को प्रारूपित कर सकते हैं।

पूर्व-निर्मित DateTimeFormatterरों अधिककम सभी मानक टाइमस्टैम्प प्रारूपों को शामिल करना चाहिए। उदाहरण के लिए, ISO_INSTANTपार्स कर सकते हैं 2011-12-03T10:15:30.123457Z

यदि आपके पास कुछ विशेष प्रारूप हैं, तो आप अपना स्वयं का DateTimeFormatter (जो कि एक पार्सर भी है) बना सकते हैं

private static final DateTimeFormatter TIMESTAMP_PARSER = new DateTimeFormatterBuilder()
   .parseCaseInsensitive()
   .append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SX"))
   .toFormatter();

मैं स्रोत कोड को देखने की सलाह देता हूं DateTimeFormatterऔर इसका उपयोग करने के तरीके के बारे में प्रेरित करता हूं DateTimeFormatterBuilder। जब आप वहां हों, तो यह भी देख ResolverStyleलें कि प्रारूप या अस्पष्ट जानकारी के लिए पार्सर LENIENT, SMART या STRICT है या नहीं।

TemporalAccessor

अब, लगातार गलती की जटिलता में जाना है TemporalAccessor। यह आता है कि डेवलपर्स के साथ काम करने के लिए कैसे इस्तेमाल किया गया था SimpleDateFormatter.parse(String)। सही, DateTimeFormatter.parse("...")आपको देता है TemporalAccessor

// No need for this!
TemporalAccessor ta = TIMESTAMP_PARSER.parse("2011-... etc");

लेकिन, पिछले अनुभाग से ज्ञान से सुसज्जित, आप आसानी से उस प्रकार का पार्स कर सकते हैं, जिसकी आपको आवश्यकता है:

OffsetDateTime myTimestamp = OffsetDateTime.parse("2011-12-03T10:15:30.123457Z", TIMESTAMP_PARSER);

आपको वास्तव में DateTimeFormatterदोनों की आवश्यकता नहीं है । जिस तरह से आप पार्स करना चाहते हैं, उसके parse(String)तरीके हैं।

OffsetDateTime myTimestamp = OffsetDateTime.parse("2011-12-03T10:15:30.123457Z");

TemporalAccessorयदि आप स्ट्रिंग में कौन सी जानकारी है, इसका एक अस्पष्ट विचार है, और रनटाइम के बारे में निर्णय लेना चाहते हैं, तो इसके बारे में , आप इसका उपयोग कर सकते हैं।

मुझे आशा है कि मैं आपकी आत्मा पर समझ के कुछ प्रकाश डाला :)

नोट: java.timeजावा 6 और 7 का बैकपोर्ट है : थ्रीटेन-बैकपोर्ट । Android के लिए इसमें तीनTENABP है

[१] सिर्फ इतना ही नहीं कि वे धारियाँ नहीं हैं, बल्कि कुछ अजीब चरम सीमाएँ भी हैं। उदाहरण के लिए, कुछ पड़ोसी प्रशांत द्वीपों में +14: 00 और -11: 00 समय क्षेत्र हैं। इसका मतलब है, कि एक द्वीप पर, 1 मई 3 बजे, दूसरे द्वीप पर अभी तक नहीं है, यह अभी भी 30 अप्रैल 12 बजे है (यदि मैं सही ढंग से गिना जाता हूं :))


3

आवश्यक प्रारूप में CURRENT UTC समय प्राप्त करें

// Current UTC time
        OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

        // GET LocalDateTime 
        LocalDateTime localDateTime = utc.toLocalDateTime();
        System.out.println("*************" + localDateTime);

        // formated UTC time
        DateTimeFormatter dTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF.format(localDateTime));

        //GET UTC time for current date
        Date now= new Date();
        LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
        DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));

0

मुझे इस तरह के दिनांक समय प्रारूप के कई प्रकारों को कवर करना अद्भुत लगा:

final DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"))
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0);

1
`` `सार्वजनिक अंतिम स्थैतिक DateTimeFormatter TIMESTAMP_XX = नया DateTimeFormatterBuilder ()। appendPattern (" [[uuuu] [- MM] [- dd]] [HH] [: ss] [[SSS]]] ")। parseDefaulting (ChronoField.YEAR, 2020) .parseDefaulting (ChronoField.MONTH_OF_YEAR, 1) .parseDefaulting (ChronoField.DAYDOF_MONTH, 1) .parseDefaulting (ChronoField.HOUR_DoDDDDDDD .D0FDDDDDDDD .D0FDD .D0FDD0DDD0DD0D0DD0DD0DD0DD0DD0DD0DD0DD0DD0DD0D05D05D05D05D05D05D05D05D05D05D05D05D05D05D05D05A03D03D03DH05DH05DH05DH03DH05DD पर) पर क्लिक करें। , 0) .parseDefaulting (ChronoField.NANO_OF_SECOND, 0) .toFormatter (); `` `
एलन स्टीवर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.