तारीख, घंटे और मिनट के साथ आईएसओ 8601 प्रारूप में वर्तमान क्षण कैसे प्राप्त करें?


323

वर्तमान क्षण, यूटीसी के आईएसओ 8601 स्वरूपित प्रस्तुति पाने का सबसे सुरुचिपूर्ण तरीका क्या है ? यह दिखना चाहिए 2010-10-12T08:50Z:।

उदाहरण:

String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);


5
@marcolopes खबरदार, एक private static SimpleDateFormatका उपयोग धागा सुरक्षित नहीं है।
vegemite4me


इस अन्य प्रश्न के समान , लेकिन यह कि एक पूरे सेकंड में घूमता है, जबकि यह प्रश्न पूरे मिनट में छोटा हो जाता है।
तुलसी बॉर्क

जवाबों:


292

अपनी इच्छित SimpleDateFormatकिसी भी Dateवस्तु को प्रारूपित करने के लिए उपयोग करें :

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

new Date()ऊपर दिखाए गए अनुसार उपयोग करने से वर्तमान समय प्रारूपित हो जाएगा।


8
@ जोशिम इस "मानक" दृष्टिकोण का नकारात्मक पक्ष यह है कि मुझे "yyyy-MM-dd'T'HH:mmZ"अपने आवेदन में कई उदाहरण हैं , जब भी मुझे आईएसओ -0101 स्वरूपित तारीख की आवश्यकता होती है। JodaTime के साथ, जैसा कि मैं देख रहा हूं, मैं एक पूर्व-परिभाषित फॉर्मैटर का उपयोग कर सकता हूं ISODateTimeFormat, जो मेरे लिए यह काम करता है ..
yegor256

8
@ जोचिम, सिंपलडेटफार्म Zमें मान्य पैटर्न है, बल्कि ऐसा करें yyyy-MM-dd'T'HH:mm'Z':।
बुहके सिंडी

33
-1 यह आपको वर्तमान समय क्षेत्र में तारीख / समय देता है - यूटीसी नहीं। कार्लोस के उत्तर में आवश्यक यूटीसी कोड शामिल है।
स्कॉट रिपी

16
मैंने सिर्फ टाइमजोन की गलती को ठीक किया - चूंकि यह स्वीकृत उत्तर है, मुझे लगता है कि यह सही काम था।
BoD

2
Z को "yyyy-MM-dd'T'HH: mm'Z 'की तरह उद्धृत करने की आवश्यकता है
किमबॉल रॉबिन्सन

224

उन प्रणालियों के लिए जहां डिफ़ॉल्ट समय क्षेत्र UTC नहीं है:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

SimpleDateFormatयदि बार-बार की जरूरत उदाहरण एक वैश्विक निरंतर के रूप में घोषित किया जा सकता है, लेकिन सावधान रहना है कि इस वर्ग के धागे की सुरक्षित नहीं है। यदि इसे कई थ्रेड द्वारा समवर्ती रूप से एक्सेस किया गया है, तो इसे सिंक्रनाइज़ किया जाना चाहिए।

संपादित करें: अगर मैं कई अलग-अलग टाइम्स / दिनांक जोड़तोड़ कर रहा हूं तो मैं जोडा टाइम को पसंद करूंगा ...
EDIT2: सही किया गया: setTimeZoneस्ट्रिंग को स्वीकार नहीं करता (पॉल द्वारा सही किया गया)


9
इस प्रारूप में पुस्तकालय में निर्मित कुछ भी कहीं स्थिर नहीं है?
डैनियल कपलान

'DateFormat' के लिए दो अलग-अलग पैकेज हैं, 'import java.text.DateFormat' का उपयोग करना याद रखें
oabarca

3
यदि आप वर्तमान समय क्षेत्र चाहते हैं तो TimeZone tz = TimeZone.getDefault () का उपयोग करें; इसके बजाय
ओबार्का

आपको प्रारूप में 'Z' को उद्धृत नहीं करना चाहिए क्योंकि यह तार्किक रूप से महत्वहीन है। यदि TimeZone ऊपर के उदाहरण के रूप में UTC है, तो एक निर्गत Z केवल आउटपुट में Z परिणाम देगा ... हालाँकि यदि TimeZone UTC नहीं है, तो Z तब भी एक शाब्दिक रूप में UTC को लागू करेगा जब समय नहीं होगा हो। यदि एक उपभोग प्रणाली Z को UTC के रूप में पढ़ती है लेकिन समय नहीं है तो समय को स्थानांतरित कर दिया जाएगा। इसके विपरीत यदि कोई पार्सर टाइम ज़ोन को सेट किए बिना उद्धृत जेड का उपयोग करता है तो यह यूटीसी समय को स्थानीय समय (फिर से स्थानांतरण) के रूप में पार्स करेगा। यह उद्धरण आवश्यक नहीं है यदि टीबी सेट है, लेकिन खतरनाक है यदि यह नहीं है।
मैट व्हिपल

@MattWhipple - लेकिन यदि आप एक अनक्चुलेटेड Z का उपयोग करते हैं तो परिणाम कुछ ऐसा होगा 2016-06-14T13:56+0000- सवाल कुछ इस तरह पूछ रहा है2016-06-14T13:56Z
user85421

184

जावा 8 नेटिव

java.time जावा 8. और थ्रेड सेफ के बाद से इसे सरल बनाता है।

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )

परिणाम: 2015-04-14T11:07:36.639Z

आपको लाइटर का इस्तेमाल करने का लालच दिया जा सकता है Temporal जैसे Instantया LocalDateTime, पर वे समर्थन या समय क्षेत्र डेटा फ़ॉर्मेटर का अभाव है। केवल ZonedDateTimeबॉक्स से बाहर काम करता है।

ZonedDateTime और DateTimeFormatter के विकल्प / संचालन को ट्यूनिंग या चेंज करके , आप आसानी से नियंत्रित कर सकते हैं समय क्षेत्र और परिशुद्धता , एक निश्चित सीमा तक:

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )

परिणाम: 2015-04-14T11:07:00+01:00[Europe/Paris]

परिष्कृत आवश्यकताएं, जैसे कि सेकंड भाग को निकालना, अभी भी कस्टम प्रारूप या कस्टम पोस्ट प्रक्रिया द्वारा सेवा की जानी चाहिए।

.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07

Java 6 & 7 के लिए, आप java.time के बैक-पोर्ट्स पर विचार कर सकते हैं जैसे कि थ्रीटेन-बैकपोर्ट , जिसमें एंड्रॉइड पोर्ट भी है । दोनों ही Joda की तुलना में हल्के हैं, और Joda के अनुभव से सीखा है - esp। यह देखते हुए कि java.time को Joda के लेखक द्वारा डिज़ाइन किया गया है।


9
अच्छा उत्तर। जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र पर स्पष्ट रूप से भरोसा करने के बजाय एक समय क्षेत्र को स्पष्ट रूप से निर्दिष्ट करने की अच्छी आदत को नोटिस करें । यदि आप एक विशेष समय क्षेत्र निर्दिष्ट कर सकते हैं , जैसे कि ZoneId.of( "America/Montreal" )
तुलसी बोर्क

1
तत्काल आईएसओ 8601 प्रारूप में इसे केवल कॉल करने के द्वारा प्रारूपित करने की अनुमति देता है .toString () विधि:return DateTimeFormatter.ISO_INSTANT.format(this);
VadymVL

यह सबसे अच्छा है क्योंकि आप डिफ़ॉल्ट से बचते हैं।
क्रिस्टोफ रूसो

6
चेतावनी: ISO_INSTANT का उपयोग कर जावा 8 के समाधान में एक कष्टप्रद विचित्रता है। जब मिलीसेकंड 0 होता है तो वे आउटपुट में शामिल नहीं होते हैं। आईएसओ 8601 मानक के अनुसार इसकी अनुमति है लेकिन अन्य भाषाओं में कई पुस्तकालय और पार्सर्स क्षमा करने वाले नहीं हैं। यदि इसके बजाय शून्य का उपयोग हमेशा शामिल करना आवश्यक है: DateTimeFormatter ISO_8601 =Pattern ("yyyy-MM-dd'T'HH: mm: ss.SSSX") ।ZZone (UTC) के साथ;
जुर्गन

जावा 8 से 11 पर स्विच करने के बाद, मैं सेकंड के बाद 6 अंक देखता हूं DateTimeFormatter.ISO_INSTANTऔर DateTimeFormatter.ISO_DATE_TIME3 के विपरीत उपयोग करता हूं , जो अब स्प्रिंग द्वारा उठाया नहीं जाता है @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
डैनियल

126

जावा 8:

thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
                              .withZone(ZoneOffset.UTC)
                              .format(Instant.now());

पूर्व जावा 8:

thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));

से डॉक्स :

'R'    24 घंटे की घड़ी के लिए "% tH:% tM"
'F'    आईएसओ 8601 पूर्ण तिथि के रूप में "% tY-% tm-% td" के रूप में स्वरूपित समय।


26
ठीक है, या तो आप अपनी परियोजना के लिए एक निर्भरता के रूप में एक अतिरिक्त तीसरे पक्ष के पुस्तकालय को शामिल करते हैं (जिसे आप अप टू डेट रखना चाहते हैं, और अपने आवेदन के साथ जहाज कर सकते हैं, हे, यह सिर्फ एक अतिरिक्त 3.2 मेगाबाइट है) और करो DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);, या तुम करो return String.format("%tFT%<tRZ", new Date());एक कक्षा में, और करो str = Iso8601Time.now(), जहाँ कभी तुम्हारी आवश्यकता हो। (यह ऐसा नहीं है कि आईएसओ प्रारूप बदलने वाला है।) यदि यह पता चला है कि आपको आईएसओ प्रारूप में सिर्फ वर्तमान तिथि से अधिक की आवश्यकता है, तो एक उपयोग करें।
एयरोबोब

2
इससे पूरी तरह सहमत हैं।
yegor256

3
ध्यान दें कि यह बदलना संभव है कि कौन सा उत्तर स्वीकार किया गया है ;-)
aioobe

8
%tFT%<tTZसेकंड शामिल होंगे; %tFT%<tTZ.%<tLमिलीसेकंड शामिल होंगे।
पैट्रिक लिन्सकी

2
एक बहुत साफ समाधान, अब तक स्वीकृत उत्तर होना चाहिए :)
अब्देलहेडी

94

जावा 8 के अनुसार आप बस कर सकते हैं:

Instant.now().toString();

से java.time.Instantडॉक्स:

अभी

public static Instant now()

सिस्टम क्लॉक से वर्तमान तत्काल प्राप्त करता है।

यह वर्तमान तत्काल प्राप्त करने के लिए सिस्टम UTC घड़ी को क्वेरी करेगा ।

 


public String toString()

ISO-8601 प्रतिनिधित्व का उपयोग करके इस तत्काल का एक स्ट्रिंग प्रतिनिधित्व।

उपयोग किए गए प्रारूप के समान है DateTimeFormatter.ISO_INSTANT


11
यह सही उत्तर है, और यह एक घोटाला है कि यह इन सभी मनगढ़ंत घटनाओं से अधिक नहीं है SimpleDateFormats
डेविड मोल्स

खुशी है कि मैंने और उत्तर पढ़े। मैं सहमत हूं, यह अब जवाब होना चाहिए।
Xan- कुन क्लार्क-डेविस

और क्योंकि यह है toString, कई मामलों में आपको इसे स्पष्ट रूप से कॉल करने की आवश्यकता नहीं होगी।
काया 3

1
पिछले उत्तर पर एक टिप्पणी में चेतावनी यहां भी लागू होती है: "चेतावनी: ISO_INSTANT का उपयोग कर जावा 8 के समाधान में एक कष्टप्रद विचित्रता है। जब मिलीसेकंड 0 होता है तो वे आउटपुट में शामिल नहीं होते हैं। यह आईएसओ 8601 के अनुसार अनुमति है। मानक लेकिन अन्य भाषाओं में कई पुस्तकालय और पार्सर्स क्षमा करने वाले नहीं हैं। "
डेव एल।

27

JodaTime का उपयोग करें

आईएसओ 8601 कैलेंडर प्रणाली, Joda-Time के भीतर डिफ़ॉल्ट कार्यान्वयन है

यहाँ JodaTime Formatter के लिए doc है

संपादित करें:

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

जैसा कि @Joachim Sauer ने सुझाव दिया है

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());

3
और आप एक स्ट्रिंग का निर्माण कैसे करेंगे जैसा कि प्रश्न में दिखाया गया है?
जोकिम सोउर

4
मैं कहूंगा कि यह (जो जावा-कोड की दो पंक्तियों के साथ प्राप्त किया जा सकता है) कुछ के लिए एक पुस्तकालय-निर्भरता नहीं जोड़ सकता है। (निश्चित रूप से, यदि आवश्यकताएं बढ़ती हैं, तो यह एक और कहानी है।)
एआईओबीयू

1
@aioobe, अगर इसका सिर्फ ऐप के कई हिस्सों में उपयोग किया जाता है, तो डिफ़ॉल्ट रूप से जाने के लिए इसका ठीक है, बाकी मामले में jodatime बेहतर है।
जिगर जोशी

5
@aioobe jodatime किसी भी मामले में बेहतर है, क्योंकि इसमें ISODateTimeFormatISO-8601 का पूर्वनिर्धारित स्वरूप है।
तुगोर 256

3
@ org.life.java: जो केवल तब ही प्रासंगिक होते हैं जब आप Jode के समय पर ठीक से स्विच कर सकते हैं। जब आप केवल जोडा समय के इस फ़ंक्शन का उपयोग करते हैं, तो आपके पास उन्हें नहीं होगा।
जोआचिम सॉउर

20

अपाचे से DateFormatUtilscommons-lang3 में उपयोगी स्थिरांक हैं, उदाहरण के लिए:DateFormatUtils.ISO_DATETIME_FORMAT


3
अधिक सटीक रूप से, यूटीसी में DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));वर्तमान क्षण : डिफ़ॉल्ट समय क्षेत्र में वर्तमान क्षण DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()):; @ yegor256 का उल्लेख करने के लिए धन्यवाद DateFormatUtils, बोर्ड एपाचे कॉमन्स-लैंग पर होने के कारण यह तारीख प्रारूप का उपयोग करने के लिए लायक है।
babinik

19

यदि आप जोड़ीटाइम को शामिल नहीं करना चाहते (जैसा कि यह अच्छा है)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);

जो एक स्ट्रिंग लौटाता है:

2012-07-10T16:02:48.440Z

जो मूल अनुरोध से थोड़ा अलग है, लेकिन अभी भी ISO-8601 है।



10

Joda समय

अपडेट: Joda समय परियोजना में है रखरखाव मोड , टीम के लिए प्रवास की सलाह दे साथ java.time कक्षाएं। जावा 6 और 7 के लिए, थ्रीटैन-बैकपोर्ट प्रोजेक्ट देखें, आगे थ्रीटेनबप प्रोजेक्ट में एंड्रॉइड के लिए अनुकूलित ।

जोडा-टाइम लाइब्रेरी का उपयोग ...

String output = new DateTime( DateTimeZone.UTC ).toString() ;

यह धागा-सुरक्षित है। जोडा-टाइम मौजूदा वस्तुओं को बदलने के बजाय नई अपरिवर्तनीय वस्तुएं बनाता है ।

यदि आप वास्तव में सेकंड के बिना एक प्रारूप के लिए पूछने का इरादा रखते हैं, तो मिनटों तक हल कर सकते हैं, फिर जोडा-टाइम में कई अन्य अंतर्निहित फॉर्मेटर्स में से एक का उपयोग करें।

DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;

java.time

जावा 8 और बाद के लिए, जोडा-टाइम काम करना जारी रखता है। लेकिन बिल्ट-इन java.time फ्रेमवर्क, जोडा-टाइम । इसलिए सुविधाजनक होते ही अपने कोड को Joda-Time से java.time पर माइग्रेट करें।

आधुनिक समाधान के लिए मेरा अन्य उत्तर देखें ।


जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

अब जोडा-टाइम परियोजना, रखरखाव मोड में , java.time कक्षाओं में प्रवासन की सलाह देती है ।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


7

जावा संस्करण 7 के लिए

आप Oracle प्रलेखन का पालन कर सकते हैं: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

X - का उपयोग ISO 8601 समय क्षेत्र के लिए किया जाता है

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

System.out.println(nowAsISO);

DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
//nowAsISO = "2013-05-31T00:00:00Z";
Date finalResult = df1.parse(nowAsISO);

System.out.println(finalResult);

5

आप आईएसओ 8601 के लिए निम्न पैटर्न के साथ जावा के सिंपलडैफ्टफॉर्म का उपयोग कर सकते हैं yyyy-MM-dd'T'HH:mm:ssXXX

नमूना कोड: (सभी उपलब्ध समय क्षेत्रों के लिए सूची)

for (String timeZone : TimeZone.getAvailableIDs())
{
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
    dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
    String formatted = dateFormat.format(new Date());
    System.out.print(formatted);

    if (formatted.endsWith("Z"))
    {
        // These time zone's have offset of '0' from GMT.
        System.out.print("\t(" + timeZone + ")");
    }

    System.out.println();
}

आप उपयोग कर सकते हैं:

TimeZone.getDefault ()

डिफ़ॉल्ट vm timezone के लिए। अधिक यहाँ

आप कुछ समय क्षेत्रों के लिए तिथि समय देख सकते हैं, जो समाप्त होते हैं 'Z'। इन समय क्षेत्रों में '0'GMT की भरपाई होती है।

अधिक जानकारी यहां पाई जा सकती है


5

मेरा मानना ​​है कि सबसे आसान तरीका यह है कि पहले तुरंत जाएं और फिर स्ट्रिंग की तरह:

String d = new Date().toInstant().toString();

जिसके परिणामस्वरूप होगा:

2017-09-08T12:56:45.331Z


4
यदि आप वर्तमान समय चाहते हैं, तो पुराने जमाने की Dateवस्तु से गुजरने की कोई जरूरत नहीं है । बस करो Instant.now().toString()। यदि आपको Dateविरासत एपीआई से मिला है , तो आपका तरीका सबसे अच्छा है।
ओले वीवी

के रूप में ओले वी.वी. टिप्पणी की तरह के रूप में, परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
तुलसी बोर्ख

5

tl; डॉ

Java.time कक्षाओं की सिफारिश करने में कुछ अन्य उत्तर सही हैं लेकिन आपकी विशिष्ट आवश्यकताओं के लिए अनावश्यक लंबाई का उपयोग करने के बारे में जाना।

Instant.now()                               // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
       .truncatedTo( ChronoUnit.MINUTES )   // Lop off any seconds or fractional second, to get a value in whole minutes.
       .toString()                          // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.

2018-01-23T12: 34Z

Instant::toString

jav.time.Instantवर्ग, यूटीसी में एक पल का प्रतिनिधित्व हमेशा यूटीसी में।

Instant instant = Instant.now() ;

तत्काल .toString (): 2018-01-23T12: 34: 56.123456Z

Zअपने उदाहरण स्ट्रिंग के अंत पर 2010-10-12T08:50Zउच्चारण "ज़ुलु" और इसका मतलब है यूटीसी

आपका वांछित प्रारूप आईएसओ 8601 मानक का पालन करने के लिए होता है । Java.time वर्गों / जब पार्स करने तार पैदा डिफ़ॉल्ट रूप से इन मानक प्रारूप का उपयोग करें। तो कोई स्वरूपण पैटर्न निर्दिष्ट करने की आवश्यकता नहीं है। Instant::toStringजैसा ऊपर देखा गया है वैसा ही कॉल करें ।

यदि आप विशेष रूप से दूसरे या भिन्नात्मक सेकंड के बिना पूरे मिनट चाहते हैं, तो छोटा करें। ChronoUnitकक्षा के माध्यम से समय की एक इकाई निर्दिष्ट करें ।

Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString();  // Generate a `String` object in standard ISO 8601 format.

जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

अब जोडा-टाइम परियोजना, रखरखाव मोड में , java.time कक्षाओं में प्रवासन की सलाह देती है ।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


2

यहां एक पूरी कक्षा को अनुकूलित किया गया है ताकि "अब ()" को लागू करने के लिए कुछ भी ऐसा न हो जो उसे करना पड़े।

public class Iso8601Util
{
    private static TimeZone tz = TimeZone.getTimeZone("UTC");
    private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");

    static
    {
        df.setTimeZone(tz);
    }

    public static String now()
    {
        return df.format(new Date());
    }
}

9
इसे स्टैटिक बनाने से परेशानी हो सकती है क्योंकि SimpleDateFormat थ्रेड सुरक्षित नहीं है: "दिनांक स्वरूप सिंक्रनाइज़ नहीं किए गए हैं। प्रत्येक थ्रेड के लिए अलग-अलग प्रारूप इंस्टेंसेस बनाने की अनुशंसा की जाती है। यदि एकाधिक थ्रेड्स किसी फॉर्मेट को समवर्ती रूप से एक्सेस करते हैं, तो इसे बाह्य रूप से सिंक्रनाइज़ किया जाना चाहिए।" docs.oracle.com/javase/7/docs/api/java/text/…
Juha Palomäki

2
जैसा कि @ जूहा पालोमाकी ने उल्लेख किया है, यह थ्रेडसेफ़ नहीं है। यदि आप जावा 8 या उच्चतर का उपयोग कर रहे हैं, तो ThreadLocal.withInitial इसे ठीक कर सकता है। आप जावा 7 का उपयोग कर या कम रहे हैं, तो एक नया ThreadLocal बना सकते हैं और अधिभावी द्वारा एक प्रारंभिक मूल्य की आपूर्ति ThreadLocal.initialValue
user393274

@ user393274 - यदि आप जावा 8 का उपयोग कर रहे हैं, तो आपको उपयोग करना चाहिए Instant, DateTimeFormatऔर अन्य आधुनिक थ्रेड सुरक्षित प्रतिस्थापन

मैं थोड़ा सा हैरान हूँ कि क्या समस्या है SimpleDateFormat के साथ थ्रेड सुरक्षित नहीं है। यदि दो थ्रेड्स एक ही समय में स्टैटिक इनिशियलाइज़र को अंजाम देते हैं, तो मैं कुछ भी बुरा नहीं देख सकता हूँ जो कि SimpleDateFormat कंस्ट्रक्टर को दो बार कहा जाता है, लेकिन इसका केवल एक पल (अंतिम समाप्ति तक) "df" के रूप में दर्ज हो जाता है।
गिल्बर्टपिल्ज़

2
private static String getCurrentDateIso()
{
    // Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    return dateFormat.format(new Date());
}

1

फिर भी, joda-time केवल विस्तारित प्रारूप का समर्थन करता है: "2015-12-09T00: 22: 42.930Z" मूल नहीं: "20151209T002242.930Z" ... हम जावा SimpleDateFormat के साथ प्रारूपों की सूची का परीक्षण करना बेहतर हो सकता है।


1

मैंने इसे एंड्रॉइड में कैलेंडर और SimpleDateFormat का उपयोग करके किया था। निम्न पद्धति "GMT" TimeZone के साथ एक कैलेंडर लौटाती है (यह सार्वभौमिक समय क्षेत्र है)। तब आप कैलेंडर समय की विधि setTimeZone () का उपयोग करके, अलग-अलग समय क्षेत्रों के बीच घंटे सेट करने के लिए कैलेंडर वर्ग का उपयोग कर सकते हैं।

private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss";

public static Calendar isoToCalendar(final String inputDate) {
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
        dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
        Date date = dateFormat.parse(inputDate);
        calendar.setTime(date);
    } catch (ParseException e) {
        Log.e("TAG",e.getMessage());
    }
    return calendar;
}

रिमेम्बर: दिनांक वर्ग टाइमजोन अस्तित्व के बारे में नहीं जानता है। इस कारण से, यदि आप एक तारीख को डिबग करते हैं, तो आप हमेशा अपने वर्तमान समय क्षेत्र की तारीख देखते हैं।


1

यदि आप प्रदर्शन के बारे में परवाह करते हैं, तो मैंने एक लाइब्रेरी बनाई जो कि मानक रूप से जावा पार्सर को बेहतर बनाती है और ISO8601-स्वरूपित तारीखों के साथ छेड़छाड़ करती है। डेटाटाइमप्रोसेसर कार्यान्वयन थ्रेड-सुरक्षित हैं और इन्हें समवर्ती मानचित्र या स्थिर फ़ील्ड में कैश किया जा सकता है।

<dependency>
  <groupId>com.axibase</groupId>
  <artifactId>date-processor</artifactId>
  <version>1.0.3</version>
</dependency>
import com.axibase.date.DatetimeProcessor;
import com.axibase.date.PatternResolver;
import org.junit.Before;
import org.junit.Test;

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class DateFormatTest {
    private Clock clock;

    @Before
    public void prepare() {
        clock = Clock.fixed(Instant.ofEpochMilli(1571285405300L), ZoneId.of("Europe/Berlin"));
    }

    @Test
    public void testIsoMillis(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10:05.300Z"));
    }

    @Test
    public void testIsoMillisLocalZone(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), clock.getZone()), is("2019-10-17T06:10:05.300+02:00"));
    }

    @Test
    public void testIsoMinutes(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("yyyy-MM-ddTHH:mmXXX");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10Z"));
    }
}

0

उन्हें डेट से इंस्टेंट तक जाने के लिए किसी तरह का सरल तरीका जोड़ना चाहिए था और एक विधि भी कहा जाता है toISO8601, जो कि बहुत सारे लोग खोज रहे हैं। अन्य उत्तरों के पूरक के रूप में, java.util.Date से ISO 8601 प्रारूप में:

Instant.ofEpochMilli(date.getTime()).toString();

यह स्वत: पूर्णता का उपयोग करते समय वास्तव में दिखाई नहीं देता है लेकिन java.time.Instant.toString():

ISO-8601 का उपयोग करके इस इंस्टेंट का एक स्ट्रिंग प्रतिनिधित्व


0
DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())

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

-2

इसे इस्तेमाल करे,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
        String date=sdf.format (new Date() );

आईएसओ 8601 प्रारूप के लिए


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