Java SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ss'Z '") IST के रूप में टाइमज़ोन देता है


148

मेरे पास SimpleDateFormat कंस्ट्रक्टर है

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

और मैं स्ट्रिंग को पार्स कर रहा हूं "2013-09-29T18:46:19Z".

मैंने पढ़ा है कि यहाँ Z GMT/UTCसमयक्षेत्र का प्रतिनिधित्व करता है । लेकिन जब मैं इस तिथि को कंसोल पर प्रिंट करता हूं, तो यह आईटीएस को दिए गए समय के लिए टाइमज़ेन प्रिंट करता है।

अब मेरा सवाल यह है कि मेरा आउटपुट सही है या गलत?


3
हाँ जो 'Z' का प्रतिनिधित्व करता है। Z- समय क्षेत्र
वुडी

5
Z = ज़ुलु समय => GMT + 0, आपने स्पष्ट रूप से अपने देश की सेवा नहीं की;)
MushyPeas

जवाबों:


251

आपने केवल Zसमय / दिनांक के अंत में जोड़ा गया टाइमज़ोन सेट नहीं किया है , इसलिए यह GMT दिनांक / समय जैसा दिखेगा लेकिन इससे मान नहीं बदलता है।

समय-सीमा को GMT पर सेट करें और यह सही होगा।

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

3
यदि आपके पास कोई तिथि है, तो 2012-12-06T06: 00: 00 को Z के बिना, क्या यह GMT का प्रतिनिधित्व करता है?
बाइनरीगिएंट

3
@binarygiant आपको इसे भेजने वालों से पूछना होगा। यह प्रेषक का स्थानीय समय हो सकता है।
पीटर लॉरी

2
टाइमज़ोन को "UTC"
प्रशान्त

2
अलग-अलग पुस्तकालयों के लिए कई स्थानों पर टाइमज़ोन सेट करने के बजाय और अपनी मशीन / लैपटॉप टाइमज़ोन के साथ संघर्ष से बचने के लिए, आपको हमेशा उपयोगकर्ता.टाइमज़ेन सिस्टम गुण: java -Duser .timezone = GMT सेट करके JVM का डिफ़ॉल्ट समयक्षेत्र निर्धारित करना चाहिए ...
किशन

100

'T'और 'Z'यहाँ स्थिरांक माने जाते हैं। आपको Zउद्धरण के बिना पास करने की आवश्यकता है । इसके अलावा आपको इनपुट स्ट्रिंग में टाइमज़ोन निर्दिष्ट करने की आवश्यकता है।

उदाहरण: 2013-09-29T18:46:19-0700 और प्रारूप"yyyy-MM-dd'T'HH:mm:ssZ"


सुबीर, आपके उत्तर के लिए धन्यवाद, लेकिन इनपुट स्ट्रिंग में "0700" क्या है ??
प्रदीप बोर्डे

-0700समय क्षेत्र है -7: 00 बजे
सुबीर कुमार साओ

12
-07: 00 घंटे और -0700 के लिए नहीं, यह निम्नलिखित होगा: yyyy-MM-dd'T'HH: mm: ss.SSSXXX
टेस्टीब्रॉनिज

48

आईएसओ 8601 स्ट्रिंग से जावा तिथि वस्तु तक

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013

यदि आप सेट नहीं करते हैं TimeZone.getTimeZone("GMT")तो यह आउटपुट करेगाSun Sep 29 18:46:19 CST 2013

जावा डेट ऑब्जेक्ट से आईएसओ 8601 स्ट्रिंग तक

और Dateवस्तु को आईएसओ 8601 मानक में परिवर्तित करने के लिए ( yyyy-MM-dd'T'HH:mm:ss'Z') निम्नलिखित कोड का उपयोग करें

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));           
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z

यह भी ध्यान दें कि ' 'जेड yyyy-MM-dd'T'HH:mm:ssZप्रिंट के बिना2015-01-22T03:41:02+0000


2
यह मुझे java.text.ParseException: Unparseable दिनांक: "2018-05-01T18: 30: 00.000Z" @AZ_
Mansuu ....

41

यदि आप तिथि के ' मानक ' JSON प्रतिनिधित्व को संभालना चाहते हैं तो इस पैटर्न का उपयोग करने के लिए बेहतर है "yyyy-MM-dd'T'HH:mm:ssX":।

Xअंत में सूचना दें । यह आईएसओ 8601 मानक में टाइमज़ोन को संभाल लेगा , और आईएसओ 8601 जावास्क्रिप्ट में इस कथन का निर्माण करता हैnew Date().toJSON()

अन्य उत्तरों की तुलना में इसके कुछ लाभ हैं:

  1. आपको अपने ग्राहकों को GMT में तारीख भेजने की आवश्यकता नहीं है
  2. इसका उपयोग करने के लिए आपको अपनी दिनांक वस्तु को GMT में स्पष्ट रूप से परिवर्तित करने की आवश्यकता नहीं है: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

1
मैं playस्वत: फ़ॉर्म बाइंडिंग का उपयोग कर रहा हूं , और @Format.DateTimeएनोटेशन का उपयोग करता हूं । Zसमाप्ति के साथ डिफ़ॉल्ट पैटर्न का उपयोग करना गलत प्रतीत होता है। बदलने के बाद X, यह काम करता है। बहुत धन्यवाद
3'16

यदि आपकी तारीख "-0500" जैसे RFC822-अनुरूप फैशन में टाइमज़ोन निर्दिष्ट करती है, तो यह ठीक काम करता है। लेकिन एक तारीख के लिए जैसे "2013-07-15T10: 22: 17-05: 00" (यह भी मान्य ISO8601 TZ) इस विराम को तोड़ता है। उस स्थिति में आपको "yyyy-MM-dd'T'HH: mm: ssXXX" का उपयोग करना होगा।
लैम्बर्ट

23

tl; डॉ

अन्य उत्तर जावा 8 के रूप में दिए गए हैं।

Instant                           // Represent a moment in UTC. 
.parse( "2013-09-29T18:46:19Z" )  // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone(                          // Adjust from UTC to a time zone. 
    ZoneId.of( "Asia/Kolkata" )
)                                 // Returns a `ZonedDateTime` object. 

आईएसओ 8601

आपका स्ट्रिंग प्रारूप ISO 8601 मानक का पालन करने के लिए होता है । यह मानक पाठ के रूप में विभिन्न तिथि-समय मूल्यों का प्रतिनिधित्व करने के लिए समझदार स्वरूपों को परिभाषित करता है।

java.time

जावा / और बाद में बनाए गए java.time ढांचे द्वारा पुराने java.util.Date/ .Calendarऔर java.text.SimpleDateFormatवर्गों को दबा दिया गया है। ट्यूटोरियल देखें । पुरानी कक्षाओं से बचें क्योंकि वे खराब रूप से डिजाइन किए गए, भ्रमित करने वाले और परेशान करने वाले साबित हुए हैं।

पुरानी कक्षाओं में खराब डिज़ाइन के हिस्से ने आपको काट लिया है, जहां toStringविधि जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र को लागू करती है जब वास्तव में UTC (GMT) में दिनांक-समय मान का पाठ प्रतिनिधित्व उत्पन्न करता है; सुविचारित लेकिन भ्रमित करने वाला।

Java.time कक्षाएं डिफ़ॉल्ट रूप से आईएसओ 8601 प्रारूपों का उपयोग करती हैं, जब दिनांक-समय मानों के शाब्दिक प्रतिनिधित्व को पार्स / उत्पन्न करते हैं। तो एक पार्सिंग पैटर्न निर्दिष्ट करने की आवश्यकता नहीं है।

एक Instantमें समय रेखा पर एक पल है यूटीसी

Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );

आप एक समय क्षेत्र लागू कर सकते हैं के रूप में एक ZonedDateTimeवस्तु का उत्पादन करने की जरूरत है ।

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );

जावा में तिथि-समय प्रकारों की तालिका, दोनों आधुनिक और विरासत


22

और अगर आपके पास java8 पर बेहतर विकल्प का उपयोग करने का विकल्प नहीं है तो 'yyyy-MM-dd'T'HH: mm: ssX XX ' क्योंकि यह सही ढंग से फिर से पार्स हो जाता है (जबकि केवल एक एक्स के साथ ऐसा नहीं हो सकता है। .. आपके पार्सिंग फंक्शन पर निर्भर करता है)

X उत्पन्न करता है: +01

XXX उत्पन्न करता है: +01: 00


0

जावा 8 के लिए: आप java.time.format.DateTimeFormatterटाइपो के किसी भी अवसर को कम करने के लिए इनबिल्ट का उपयोग कर सकते हैं , जैसे

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_ZONED_DATE_TIME 2011-12-03T10:15:30+01:00[Europe/Paris]ओरेकल लिंक द्वारा प्रदान किए गए बंडल किए गए मानक DateTime स्वरूपों में से एक है

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