आईएसओ 8601 फॉर्मेट से .NET डेटटाइम कैसे बनाएं


130

मैंने पाया है कि एक आईएसओ 8601 प्रारूप में एक डेटटाइम कैसे बदल सकता है , लेकिन सी # में रिवर्स कैसे करें, इस पर कुछ भी नहीं।

मेरे पास है 2010-08-20T15:00:00Z, और मैं इसे एक DateTimeवस्तु में बदलना चाहता हूं ।

मैं अपने आप को स्ट्रिंग के हिस्सों को अलग कर सकता था, लेकिन यह उस चीज के लिए बहुत काम की तरह लगता है जो पहले से ही एक अंतरराष्ट्रीय मानक है।



1
@ ऐडिन: अगस्त २४ ’१० रात १२:०४ पर
२०

@ एडिन: और हाँ, यह एक डुप्लिकेट है। प्रारूप में एकमात्र अंतर। बाकी वही है।
abatishchev

6
@abatishchev, और यही कारण है कि यह डुप्लिकेट नहीं है। "डुप्लिकेट" में जवाब 8601 को नहीं संभालता है।
15

3
हां यह कोई डुप्लिकेट नहीं है। यह प्रश्न आईएसओ 8601 प्रारूप को पार्स करने के लिए विशिष्ट है।
जोस

जवाबों:


142

यह समाधान DateTimeStyles गणना का उपयोग करता है, और यह Z के साथ भी काम करता है।

DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);

यह समाधान को पूरी तरह से प्रिंट करता है।


3
DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);लगता है के संपादित समाधान अच्छी तरह से काम करने के लिए।
j3ko

4
किसी को भी इस DateTimeStyles.RoundtripKind? MSDN विवरण पर विस्तृत करना चाहते हैं रिक्त है।
स्टीव पैरिश

8
ऐसा लगता है कि इस प्रश्न को एक बेहतर उत्तर को प्रतिबिंबित करने के लिए संपादित किया गया था, लेकिन चूंकि @MamDD ने मूल उत्तर को ओवरराइड किया, टिप्पणियां बहुत भ्रामक हो जाती हैं। शुरुआत में मुझे यकीन नहीं था कि शीर्ष पर टिप्पणियों के कारण उत्तर सही है लेकिन फिर मुझे एहसास हुआ कि गलत उत्तर को बाद में सही एक के साथ बदल दिया गया था
एडिन

5
भिन्नात्मक अंकों के साथ मेरे लिए काम नहीं करता है। 2018-06-19T14:56:14.123ZUTC नहीं, बल्कि स्थानीय समय के रूप में पार्स किया जाता है। मैं CultureInfo.InvariantCultureअशक्त के बजाय उपयोग करता हूं ।
एरिक हार्ट

1
अधिक जानकारी के लिए DateTimeStyles.RoundTripKind, stackoverflow.com/q/39572395/2014893
रॉबर्ट के। बेल

33

हालाँकि MSDN का कहना है कि "s" और "o" प्रारूप मानक को दर्शाते हैं, वे इसके केवल एक सीमित उपसमूह को पार्स करने में सक्षम प्रतीत होते हैं। विशेष रूप से यह एक समस्या है अगर स्ट्रिंग में समय क्षेत्र विनिर्देश शामिल हैं। (न तो यह बुनियादी ISO8601 स्वरूपों के लिए करता है, या सटीक प्रारूपों को कम करता है - हालांकि यह वास्तव में आपका मामला नहीं है।) यही कारण है कि जब मैं ISO8601 को पार्स करने की बात आती है तो मैं कस्टम प्रारूप का उपयोग करता हूं। वर्तमान में मेरा पसंदीदा स्निपेट है:

static readonly string[] formats = { 
    // Basic formats
    "yyyyMMddTHHmmsszzz",
    "yyyyMMddTHHmmsszz",
    "yyyyMMddTHHmmssZ",
    // Extended formats
    "yyyy-MM-ddTHH:mm:sszzz",
    "yyyy-MM-ddTHH:mm:sszz",
    "yyyy-MM-ddTHH:mm:ssZ",
    // All of the above with reduced accuracy
    "yyyyMMddTHHmmzzz",
    "yyyyMMddTHHmmzz",
    "yyyyMMddTHHmmZ",
    "yyyy-MM-ddTHH:mmzzz",
    "yyyy-MM-ddTHH:mmzz",
    "yyyy-MM-ddTHH:mmZ",
    // Accuracy reduced to hours
    "yyyyMMddTHHzzz",
    "yyyyMMddTHHzz",
    "yyyyMMddTHHZ",
    "yyyy-MM-ddTHHzzz",
    "yyyy-MM-ddTHHzz",
    "yyyy-MM-ddTHHZ"
    };

public static DateTime ParseISO8601String ( string str )
{
    return DateTime.ParseExact ( str, formats, 
        CultureInfo.InvariantCulture, DateTimeStyles.None );
}

यदि आपको TZ-less स्ट्रिंग्स (I do) को पार्स करने में कोई आपत्ति नहीं है, तो आप कवर किए गए प्रारूप परिवर्तनों की संख्या को बढ़ाने के लिए "s" लाइन जोड़ सकते हैं।


3
मैं दिनों के लिए सटीकता के लिए सरणी "yyyyMMdd"में जोड़ formatsदूंगा, क्योंकि यह कभी-कभी ऐसा होता है जब एक RFC 5545 RRULE समय प्रदान करने के लिए DTSTART पर निर्भर करेगा।
काइल फाल्कनर

1
उपयोग Kकरने से आप अपने अलग-अलग टाइम-जोन हैंडलिंग को एक साथ रोल कर सकते हैं। मैं stackoverflow.com/a/31246449/400547 पर एक अधिक व्यापक संस्करण है, लेकिन यह बहुत व्यापक है (सामान स्वीकार करता है जो आईएसओ 8601 मान्य है, लेकिन अधिक सामान्य प्रोफाइल में उपयोग नहीं किया जाता है) लेकिन यह दिखाता है कि कैसे Kआकार को कम कर सकते हैं तीसरा।
जॉन हैना

20
using System.Globalization;

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00",
    "s",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, out d);

1
LinqPad में झूठी और डी ~~> "1/1/0001 12:00:00 AM" का उत्पादन :(
Reb.Cabin

@ रिब: "2010-08-20T15: 00: 00" और "एस", यदि कोई "जेड" अंत में नहीं है
abatishchev

सही किया गया :) Z मेरे सभी नमूनों में दिखाई देता है (जो विभिन्न जीपीएस यूनिट और GPX फाइलों से आता है)
Reb.Cabin

एक और आईएसओ 8601 संदर्भ में पता चला है कि "जेड" ज़ोन के लिए खड़ा है - जैसा कि टाइम ज़ोन में है।
Reb.Cabin

30
जेड वास्तव में ज़ुलु समय या यूटीसी के लिए खड़ा है। en.wikipedia.org/wiki/ISO_8601#UTC
पीटर स्टीफेंस

19

यहाँ एक है जो मेरे लिए बेहतर काम करता है ( LINQPad संस्करण):

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00Z",
    @"yyyy-MM-dd\THH:mm:ss\Z",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, 
    out d);
d.ToString()

पैदा करता है

true
8/20/2010 8:00:00 AM

वर्तमान में अपनी यूनिट परीक्षणों में यह सत्यापित करने के लिए इसका उपयोग कर रहा हूं कि मेरे द्वारा दिनांकित सभी तार Iso8601 प्रारूप के हैं। धन्यवाद!
anthv123

1
यह UTC में नहीं एक टाइमस्टैम्प वापस क्यों करता है ?! "अस्सुमुनिवासील" के साथ "इनवेरियंट कल्चर" के बाद से लिस्ट विस्मय के सिद्धांत का एक बड़ा उल्लंघन, ऐसा नहीं करना चाहिए क्योंकि डीएसटी दुनिया भर में इतनी बेतहाशा भिन्न होती है, इसलिए आपके स्थानीय प्रचलित समय क्षेत्रों में लौटने पर कोड शुरू करने पर कीड़े लग सकते हैं। विभिन्न सेटिंग्स के साथ एक सर्वर पर!
इलास्कानेटर

7

TryParseExactकाम करने के लिए आईएसओ स्ट्रिंग के प्रारूप से बिल्कुल मेल खाना महत्वपूर्ण लगता है । मुझे लगता है कि सटीक सटीक है और यह जवाब सबसे अधिक है, लेकिन वैसे भी ...

मेरे मामले में, Reb.Cabin का जवाब काम नहीं करता है क्योंकि मेरे नीचे "मूल्य" के अनुसार थोड़ा अलग इनपुट है।

मान: 2012-08-10T14:00:00.000Z

मिलीसेकंड के लिए वहाँ कुछ अतिरिक्त 000 हैं और अधिक हो सकते हैं।

हालाँकि अगर मैं .fffनीचे दिखाए गए प्रारूप में कुछ जोड़ता हूं , तो सब ठीक है।

प्रारूप स्ट्रिंग: @"yyyy-MM-dd\THH:mm:ss.fff\Z"

VS2010 तत्काल विंडो में:

DateTime.TryParseExact(value,@"yyyy-MM-dd\THH:mm:ss.fff\Z", CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal, out d);

सच

आपको DateTimeStyles.AssumeLocalइस बात पर निर्भर करना होगा कि आपका समय किस क्षेत्र के लिए है ...


1
यह मेरे लिए काम किया, लेकिन मैं भी परिवर्तन करना पड़ा AssumeUniversalकरने के लिए AdjustToUniversal
अगस्तो बैरेटो

4

यह LINQPad4 में ठीक काम करता है:

Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00Z"));
Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00"));
Console.WriteLine(DateTime.Parse("2010-08-20 15:00:00"));

-1

DateTime.ParseExact(...) आपको पार्सर को यह बताने की अनुमति देता है कि प्रत्येक वर्ण क्या दर्शाता है।

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