यह दिनांक प्रारूप क्या है? 2011-08-12T20: 17: 46.384Z


381

मैं निम्नलिखित तिथि: 2011-08-12T20:17:46.384Z। यह कौन सा प्रारूप है? मैं इसे जावा 1.4 के माध्यम से पार्स करने की कोशिश कर रहा हूं DateFormat.getDateInstance().parse(dateStr)और मुझे मिल रहा है

java.text.ParseException: अप्राप्य तिथि: "2011-08-12T20: 17: 46.3Z"

मुझे लगता है कि मुझे पार्सिंग के लिए SimpleDateFormat का उपयोग करना चाहिए , लेकिन मुझे पहले प्रारूप स्ट्रिंग को जानना होगा। मेरे पास इसके लिए अब तक का सब कुछ है yyyy-MM-dd, क्योंकि मुझे नहीं पता कि Tइस स्ट्रिंग में क्या मतलब है - कुछ समय क्षेत्र से संबंधित? यह दिनांक स्ट्रिंग फ़ाइलें CMIS डाउनलोड इतिहास मीडिया प्रकारlcmis:downloadedOn पर दिखाए गए टैग से आ रही है ।



3
@TomaszNurkiewicz, यह नहीं है। ISO8601 में अंत में Z नहीं है।
t1gor

4
ISO8601 doe अंत में एक Z की अनुमति देता है। ऊपर लिंक देखें, UTC देखें।
जोनाथन रोज़ेन

2
@ t1gor Zअंत में यूटीसी काZulu मतलब है और कम है । इस प्रारूप में सबसे निश्चित रूप से है के भाग के आईएसओ 8601 मानक तिथि बार का पाठ स्वरूपों में से संग्रह। वैसे, इन मानक प्रारूपों का उपयोग डिफ़ॉल्ट रूप से java.time कक्षाओं में किया जाता है ।
बेसिल बॉर्क

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

जवाबों:


511

समय से तारीख को अलग करने के लिए टी सिर्फ एक शाब्दिक है, और जेड का अर्थ है "शून्य घंटे की ऑफसेट" जिसे "ज़ुलु समय" (यूटीसी) के रूप में भी जाना जाता है। यदि आपके तार में हमेशा "Z" होता है, तो आप इसका उपयोग कर सकते हैं:

SimpleDateFormat format = new SimpleDateFormat(
    "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

या फिर Joda Time का इस्तेमाल कर सकते हैं ISODateTimeFormat.dateTime()


7
क्यों हम एकल उद्धरण के आसपास की आवश्यकता है Tऔर Z?
मारून

7
@MarounMaroun: मूल रूप से हम उन शाब्दिक पात्रों को चाहते हैं । यह आवश्यक नहीं हो सकता है T(मुझे याद नहीं है कि कैसे SimpleDateFormat अज्ञात स्पेसर को संभालता है) लेकिन Zहम चाहते हैं कि यह "UTC ऑफसेट मूल्य" (जैसे "00") के बजाय 'Z' अक्षर हो।
जॉन स्कीट

2
@nyedidikeke: आपके द्वारा लिंक किए गए विकिपीडिया पृष्ठ में, यह UTC के लिए "ज़ुलु समय क्षेत्र" दिखाता है। मुझे यकीन नहीं है कि आपको लगता है कि आप सही कर रहे हैं।
जॉन स्कीट

9
@JonSkeet: यह एक अनावश्यक बहस उत्पन्न कर सकता है; अपने उत्तर पर विवाद न करें, लेकिन Z पर ध्यान आकर्षित करने का इरादा रखें, जो अपने पत्र को "शून्य यूटीसी ऑफसेट" से प्रारंभिक मिला। पत्र जेड को नाटो ध्वन्यात्मक वर्णमाला में "ज़ुलु" के रूप में जाना जाता है । बदले में, शून्य यूटीसी ऑफसेट को संदर्भित करने के लिए सैन्य दृष्टिकोण पत्र Z पर लंगर डाला गया है, जिसे वे ज़ुलु के रूप में पहचानते हैं, इसे अपने कोडित नाम से अर्जित करते हैं: ज़ुलु समय क्षेत्र। यह ध्यान रखना महत्वपूर्ण है कि जेड ने अपना अर्थ नहीं खोया है और अभी भी शून्य यूटीसी ऑफसेट के लिए ज़ोन टाइम ज़ोन के रूप में ज़ोन डिज़ाइनर है (ज़ेड से) इसे संदर्भित करने के लिए बस विरासत में मिली कोडेड भाषा है।
nyedidikeke

2
@nyedidikeke: मैं अभी भी इस बात से असहमत हूं कि क्या कोई और कभी मेरे उत्तर के संदर्भ में भेद के बारे में परवाह करने वाला है, लेकिन मैंने इसे अपडेट किया है। मैं हालांकि सभी विवरणों में जाने वाला नहीं हूं, क्योंकि इतिहास उत्तर में व्यापक रूप से अप्रासंगिक है।
जॉन स्कीट

86

tl; डॉ

मानक आईएसओ 8601 प्रारूप का उपयोग आपके इनपुट स्ट्रिंग द्वारा किया जाता है।

Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

आईएसओ 8601

यह प्रारूप समझदार व्यावहारिक मानक, आईएसओ 8601 द्वारा परिभाषित किया गया है ।

Tसमय दिन-का-भाग से तारीख हिस्से अलग करती है। Zअंत पर इसका मतलब यूटीसी (यह है कि, एक ऑफसेट-यूटीसी से शून्य घंटे-मिनट-सेकंड की)। Zहै "ज़ुलु" का उच्चारण

java.time

जावा के शुरुआती संस्करणों के साथ बंडल किए गए पुराने डेट-टाइम क्लासेस खराब रूप से डिज़ाइन किए गए, भ्रमित करने वाले, और परेशान करने वाले साबित हुए हैं। इनसे बचें।

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

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

Instantकक्षा में समय रेखा पर एक पल का प्रतिनिधित्व करता यूटीसी के एक संकल्प के साथ नैनोसेकंड । वह वर्ग सीधे स्वरूपण पैटर्न को परिभाषित करने की जहमत उठाए बिना आपके इनपुट स्ट्रिंग को पार्स कर सकता है।

Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;

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


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

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

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

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

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

जावा या एंड्रॉइड के किस संस्करण के साथ उपयोग करने के लिए किस java.time लाइब्रेरी की तालिका

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


3
@star "ज़ुलु" सैन्य और उड्डयन परंपरा से आता है जहां वर्णमाला AZ (कोई "J") के 25 अक्षर, प्रत्येक अक्षर का नाम उच्चारण होता है, समय क्षेत्र के उनके संस्करण का प्रतिनिधित्व करता है । "ज़ुलु" ज़ोन यूटीसी से शून्य घंटे ऑफसेट है। यह और यह देखें ।
बेसिल बोर्के

27

जावा पार्सिंग के बारे में निश्चित नहीं है, लेकिन यह ISO8601 है: http://en.wikipedia.org/wiki/ISO_8601


क्या यह "2016-01-27T17: 44: 55UTC", ISO8601 भी है?
user1997292

मैं ऐसा नहीं मानता। यह करीब है लेकिन प्रत्यय के रूप में UTC की अनुमति नहीं है। यह Z या टाइम ज़ोन ऑफ़सेट होना चाहिए, जैसे, +0100। Z और UTC का एक ही अर्थ है, हालांकि, इसलिए UTC को Z में बदलने से वैध ISO 8601 निकलेगा।
smpares

9

पहले उत्तर के बजाय इसे पार्स करने के अन्य तरीके हैं। इसे पार्स करने के लिए:

(1) यदि आप तिथि और समय के बारे में जानकारी लेना चाहते हैं, तो आप इसे ZonedDatetime( जावा 8 से ) या Date(पुरानी) वस्तु के लिए पार्स कर सकते हैं :

// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);

या

// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";

// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);

Date myDate = df.parse("2011-08-12T20:17:46.384Z");

(2) यदि आप तारीख और समय की परवाह नहीं करते हैं और सिर्फ नैनो सेकेंड्स में एक पल के रूप में जानकारी का इलाज करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं Instant:

// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");

1

यदि आप लोग एंड्रॉइड के लिए कोई समाधान ढूंढ रहे हैं, तो आप टाइमस्टैम्प स्ट्रिंग से एपोच सेकंड प्राप्त करने के लिए निम्न कोड का उपयोग कर सकते हैं।

public static long timestampToEpochSeconds(String srcTimestamp) {
    long epoch = 0;

    try {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            Instant instant = Instant.parse(srcTimestamp);
            epoch = instant.getEpochSecond();
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'", Locale.getDefault());
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date date = sdf.parse(srcTimestamp);
            if (date != null) {
                epoch = date.getTime() / 1000;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return epoch;
}

नमूना इनपुट: 2019-10-15T05: 51: 31.537979Z

नमूना उत्पादन: 1571128673


0

आप निम्न उदाहरण का उपयोग कर सकते हैं।

    String date = "2011-08-12T20:17:46.384Z";

    String inputPattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    String outputPattern = "yyyy-MM-dd HH:mm:ss";

    LocalDateTime inputDate = null;
    String outputDate = null;


    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputPattern, Locale.ENGLISH);
    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputPattern, Locale.ENGLISH);

    inputDate = LocalDateTime.parse(date, inputFormatter);
    outputDate = outputFormatter.format(inputDate);

    System.out.println("inputDate: " + inputDate);
    System.out.println("outputDate: " + outputDate);

आप के आसपास apostrophes नहीं रखा जाना चाहिए Z। इसका मतलब है कि उम्मीद करना लेकिन उस पत्र को अनदेखा करना। लेकिन उस पत्र को नजरअंदाज नहीं किया जाना चाहिए। यह पत्र बहुमूल्य जानकारी प्रदान करता है, यह तथ्य कि यूटीसी के लिए स्ट्रिंग शून्य का एक उद्देश्य था। आपका प्रारूप इस महत्वपूर्ण तथ्य को छोड़ रहा है। इसके अलावा, इस स्वरूपण पैटर्न को परिभाषित करने के लिए परेशान करने की भी कोई जरूरत नहीं है। इस पैटर्न के लिए एक फॉर्मेटर बनाया गया है।
तुलसी बोर्क

-1

यह तकनीक java.util का अनुवाद करती है। UTC प्रारूप (या किसी भी अन्य) के लिए और फिर से वापस।

एक वर्ग को परिभाषित करें जैसे:

import java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class UtcUtility {

public static DateTimeFormatter UTC = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZoneUTC();


public static Date parse(DateTimeFormatter dateTimeFormatter, String date) {
    return dateTimeFormatter.parseDateTime(date).toDate();
}

public static String format(DateTimeFormatter dateTimeFormatter, Date date) {
    return format(dateTimeFormatter, date.getTime());
}

private static String format(DateTimeFormatter dateTimeFormatter, long timeInMillis) {
    DateTime dateTime = new DateTime(timeInMillis);
    String formattedString = dateTimeFormatter.print(dateTime);
    return formattedString;
}

}

फिर इसे इस तरह उपयोग करें:

Date date = format(UTC, "2020-04-19T00:30:07.000Z")

या

String date = parse(UTC, new Date())

आप अन्य तिथियों को भी परिभाषित कर सकते हैं यदि आपको आवश्यकता है (सिर्फ यूटीसी की नहीं)


Joda 310 में परिभाषित आधुनिक java.time कक्षाओं द्वारा दोनों java.util.Dateको Joda-Time परियोजना को वर्षों पहले दबा दिया गया था। यहाँ सलाह लंबे समय तक पुरानी है।
तुलसी बॉर्क

java.time को जावा 8. में पेश किया गया था। यह सवाल विशेष रूप से जावा 1.4 का संदर्भ देता है और इसलिए मैंने जानबूझकर नए वर्गों के उपयोग से बचा है। यह समाधान पुराने कोड आधारों के लिए पूरा करता है। मुझे लगता है कि लेखक अपने कोडबेस को जावा 8 में स्थानांतरित कर सकता है लेकिन यह हमेशा सीधा, कुशल या आवश्यक नहीं है।
गपमिस्टर 66

-1

@ जॉन-स्कीट ने मुझे इस बारे में अपना खुद का मुद्दा ठीक करने का सुराग दिया। एक छोटे प्रोग्रामर के रूप में इस छोटे से मुद्दे को याद करना और निदान करना मुश्किल है। तो Im इसे उम्मीद में साझा करने से किसी को मदद मिलेगी।

मेरा मुद्दा यह था कि मैं एक JSON से टाइम स्टैम्प का विरोध करते हुए निम्नलिखित स्ट्रिंग को पार्स करना चाहता था जिसका मेरे ऊपर कोई प्रभाव नहीं है और इसे अधिक उपयोगी चर में डाल दिया है। लेकिन मुझे त्रुटियाँ मिलती रहीं।

तो निम्नलिखित दिए गए (स्ट्रिंग पैरामीटर के अंदर ध्यान दें);

String str = "20190927T182730.000Z"

LocalDateTime fin;
fin = LocalDateTime.parse( str, DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss.SSSZ") );

त्रुटि:

Exception in thread "main" java.time.format.DateTimeParseException: Text 
'20190927T182730.000Z' could not be parsed at index 19

समस्या? पैटर्न के अंत में दिए गए Z को 'T' की तरह ही 'Z' में लपेटना होगा। बदलें "yyyyMMdd'T'HHmmss.SSSZ"करने के लिए "yyyyMMdd'T'HHmmss.SSS'Z'" है और यह काम करता है।

Z को पैटर्न से पूरी तरह से हटा देने से भी त्रुटियां हो गईं।

सच कहूँ, मैं एक जावा वर्ग से यह उम्मीद कर रहा हूँ।


1
यह पहले से ही यहां और यहां से पूछा और उत्तर दिया गया है । और आपका समाधान गलत है। जबकि Tएक शाब्दिक और उद्धृत करने की आवश्यकता है,Z एक ऑफसेट (शून्य का) है और इस तरह के रूप में पार्स करने की आवश्यकता है, या आपको गलत परिणाम मिलेंगे। मुझे नहीं पता कि आपका क्या मतलब है कि यह प्रत्याशित नहीं है, मेरा मानना ​​है कि यह है।
ओले वीवी

1
नहीं, नहीं, नहीं, उपेक्षा मत करो Z। आप बहुमूल्य जानकारी को छोड़ रहे हैं। टाइम ज़ोन या ऑफ़सेट-यूटीसी को नज़रअंदाज़ करते हुए डेट-टाइम वैल्यू को संसाधित करना मुद्रा की अनदेखी करते हुए धन की मात्रा को संसाधित करने जैसा है!
तुलसी बोर्क

1
Tकेवल समय दिन-का-भाग से तारीख हिस्से को अलग करती है, और कोई अर्थ नहीं कहते हैं। Zदूसरी ओर निश्चित रूप से अर्थ दे रहा है।
बेसिल बॉर्क

ओले, लिंक के लिए धन्यवाद। बीमार जरूर पढ़ें और मैं स्वीकार करता हूं कि मैं निश्चित रूप से एक युवा के रूप में गलत हो सकता हूं। सभी इम कहावत है कि पैटर्न में एक चार की तरह जेड को एकल पैटर्न में लपेटने से त्रुटि हल हो गई। मेरी आलोचना यह है कि जिसने भी कक्षा का "पैटर्न" डिज़ाइन किया है, वह 'Z' (या एक अलग समय क्षेत्र?) और 'T' की उपस्थिति या अनुपस्थिति के आसपास कोडित हो सकता है या नहीं। क्योंकि वे इसके अनूठे नहीं थे। Im से निपटने वाला प्रारूप JSON से एक स्ट्रिंग में पार्स किए गए व्यावसायिक API से आता है। लेकिन मुझे उन सभी को पार्स करने की आवश्यकता है जो उन्हें अधिक उपयोगी बनाने के लिए समय कैलेंडर आदि में।
स्पैनस्मॉव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.