स्ट्रिंग के लिए तुरंत प्रारूप


227

मैं नए जावा 8 टाइम-एपीआई और एक पैटर्न का उपयोग करके एक इंस्टेंट को एक स्ट्रिंग में प्रारूपित करने की कोशिश कर रहा हूं:

Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);

उपरोक्त कोड का उपयोग करने से मुझे एक अपवाद प्राप्त होता है जो एक असमर्थित क्षेत्र की शिकायत करता है:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
    at java.time.Instant.getLong(Instant.java:608)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    ...

जवाबों:


310

समय क्षेत्र

फ़ॉर्मेट करने के लिए एक Instantएक समय-क्षेत्र की आवश्यकता है। समय-क्षेत्र के बिना, फ़ॉर्मेटर को यह नहीं पता कि मानव दिनांक-समय फ़ील्ड में तत्काल कैसे परिवर्तित किया जाए, और इसलिए एक अपवाद फेंकता है।

टाइम-ज़ोन का उपयोग करके सीधे फॉर्मेटर में जोड़ा जा सकता है withZone()

DateTimeFormatter formatter =
    DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT )
                     .withLocale( Locale.UK )
                     .withZone( ZoneId.systemDefault() );

स्ट्रिंग उत्पन्न करना

अब अपने इंस्टेंट के स्ट्रिंग प्रतिनिधित्व को उत्पन्न करने के लिए उस फ़ॉर्मेटर का उपयोग करें।

Instant instant = Instant.now();
String output = formatter.format( instant );

सांत्वना देना।

System.out.println("formatter: " + formatter + " with zone: " + formatter.getZone() + " and Locale: " + formatter.getLocale() );
System.out.println("instant: " + instant );
System.out.println("output: " + output );

जब चला।

formatter: Localized(SHORT,SHORT) with zone: US/Pacific and Locale: en_GB
instant: 2015-06-02T21:34:33.616Z
output: 02/06/15 14:34

50
धन्यवाद!! बीटीडब्ल्यू अपवाद "असमर्थित क्षेत्र" की ओर इशारा करता है, उदाहरण के लिए, वर्ष, शानदार रूप से obtuse है। शायद इस स्थिति का पता लगाया जाना चाहिए और इंस्टेंट में लापता ज़ोन आईडी को सीधे इंगित करने वाले एक अपवाद को फेंक दिया जाना चाहिए!
18

1
अधिक विचित्र रूप से, यदि आप .withZone (जैसे, .withZone (ZoneId.of ("Z")) को शामिल करते हैं और एक LocalDateTime को प्रारूपित करते हैं, तो क्षेत्र IGNORED है! इसलिए जब तक .withZone () को शामिल किया जाता है, एक ही फॉर्मेटर को इंस्टेंट के लिए और लोकलडेटेट के लिए, बाद के लिए दिखाए गए समय को प्रभावित किए बिना दोनों के लिए उपयोग किया जा सकता है।
ग्लेन

1
इस तथ्य को स्वीकार करना इतना मुश्किल क्यों है कि इंस्टेंट का एक टाइमजोन है जो जीएमटी है?
कोरा तुगे

1
@KorayTugay क्योंकि जब पांडित्य "इंस्टेंट पहले से ही GMT है" टिप्पणी सत्य हो सकती है, वे अपवाद का सामना करते समय मददगार होते हैं, जो एक अपवाद ट्रेस का सामना करने के कारण होता है क्योंकि एक समयक्षेत्र को निर्दिष्ट किए बिना एक इंस्टैंट को फॉर्मेट करना काम नहीं करता है। अच्छा होता अगर फॉर्मेट जीएमटी को डिफॉल्ट करता, लेकिन ओह अच्छा।
22

अब यह आपको yyyy-MM-dd hh:mm:ssप्रारूप देता है :DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss").withZone(ZoneId.of("Europe/Paris"));
पश्चिमीगुन

39
public static void main(String[] args) {

    DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
            .withZone(ZoneId.systemDefault());

    System.out.println(DATE_TIME_FORMATTER.format(new Date().toInstant()));

}

3
इस कोड को इस सवाल का जवाब कर सकते हैं, के बारे में अतिरिक्त संदर्भ प्रदान करने के लिए कैसे और क्यों यह हल करती है समस्या जवाब की दीर्घकालिक मूल्य में सुधार होगा।
अलेक्जेंडर

1
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
रोसारियो परेरा फर्नांडीस

23
DateTimeFormatter.ISO_INSTANT.format(Instant.now())

यह आपको UTC में परिवर्तित होने से बचाता है। हालाँकि, कुछ अन्य भाषा की समय-सीमा मिलिसेकंड का समर्थन नहीं कर सकती है, इसलिए आपको करना चाहिए

DateTimeFormatter.ISO_INSTANT.format(Instant.now().truncatedTo(ChronoUnit.SECONDS))

"कुछ अन्य भाषा की समय सीमा" से आपका क्या अभिप्राय है? क्या ISO_INSTANT.format () स्वचालित रूप से सेकंड में छोटा हो जाएगा?
गुआंगटोंग शेन

कुछ फ्रेमवर्क केवल सेकंड तक जाने की उम्मीद करते हैं क्योंकि वे पूर्ण आईएसओ सम्मेलन का पालन नहीं करते हैं और इनपुट स्ट्रिंग के भाग के रूप में मिलीसेकंड होने पर टूट जाते हैं।
आर्किमिडीज ट्रेजानो

21

Instantवर्ग जोन जानकारी शामिल नहीं है, यह केवल स्टोर, यूनिक्स काल से मिलीसेकेंड में टाइमस्टैम्प यानी 1 जनवरी 1070 यूटीसी से। इसलिए, फ़ॉर्मेटर डेट को प्रिंट नहीं कर सकता क्योंकि तारीख हमेशा कंक्रीट टाइम ज़ोन के लिए प्रिंट की जाती है। आपको फॉर्मेट करने के लिए समय क्षेत्र निर्धारित करना चाहिए और सभी इस तरह ठीक होंगे:

Instant instant = Instant.ofEpochMilli(92554380000L);
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.UK).withZone(ZoneOffset.UTC);
assert formatter.format(instant).equals("07/12/72 05:33");
assert instant.toString().equals("1972-12-07T05:33:00Z");

4

या यदि आप अभी भी पैटर्न से निर्मित फ़ॉर्मेटर का उपयोग करना चाहते हैं, तो आप इंस्टेंट के बजाय लोकलडेट टाइम का उपयोग कर सकते हैं:

LocalDateTime datetime = LocalDateTime.now();
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(datetime)

4

इंस्टैंट पहले से ही UTC में हैं और पहले से ही yyyy-MM-dd का डिफ़ॉल्ट दिनांक स्वरूप है । यदि आप इससे खुश हैं और समय क्षेत्र या स्वरूपण के साथ खिलवाड़ नहीं करना चाहते हैं, तो आप यह भी कर सकते हैं toString():

Instant instant = Instant.now();
instant.toString()
output: 2020-02-06T18:01:55.648475Z


टी और जेड नहीं चाहते हैं? (Z इंगित करता है कि यह तिथि UTC है। Z का अर्थ है "ज़ुलु" उर्फ ​​"शून्य घंटे ऑफ़सेट" उर्फ ​​UTC):

instant.toString().replaceAll("[TZ]", " ")
output: 2020-02-06 18:01:55.663763


नैनोसेकंड के बजाय मिलीसेकंड चाहिए? (इसलिए आप इसे एक sql क्वेरी में बंद कर सकते हैं):

instant.truncatedTo(ChronoUnit.MILLIS).toString().replaceAll("[TZ]", " ")
output: 2020-02-06 18:01:55.664

आदि।


-3
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
String text = date.toString(formatter);
LocalDate date = LocalDate.parse(text, formatter);

मेरा मानना ​​है कि यह मदद कर सकता है, आपको तत्काल के बजाय किसी प्रकार के स्थानीय परिवर्तन का उपयोग करने की आवश्यकता हो सकती है

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