मैं वेब UTC प्रारूप को DateTime कैसे प्रारूपित कर सकता हूं?


89

मेरे पास एक DateTime है जिसे मैं " 2009-09-01T00:00:00.000Z" प्रारूपित करना चाहता हूं , लेकिन निम्नलिखित कोड मुझे " 2009-09-01T00:00:00.000+01:00" (दोनों पंक्तियाँ) देता है:

new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")

किसी भी विचार यह कैसे काम करने के लिए?

जवाबों:


161
string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

1
@Downvoter: क्या आप हमें बताना चाहेंगे कि इस उत्तर में क्या गलत है?
ल्यूक

12
यह काम किया है, लेकिन .ToUniversalTime () आपकी मौजूदा तारीख को गड़बड़ कर देगा अगर यह पहले से ही UTC पर है लेकिन आपकाDateTime चर इसे निर्दिष्ट नहीं करता है। मैंने .ToUniversalTime () और तिथियों को हटा दिया और फिर दोनों छोरों (डेटाबेस और वेब क्लाइंट) पर अपेक्षित थी।
रॉबिन वेसे

10
यदि आपकी तारीख का समय पहले से ही सार्वभौमिक समय है, तो .ToUniversalTime()आप अपने इच्छित सभी कॉल कर सकते हैं, यह इसे नहीं बदलेगा। - हालांकि, अगर आपको एक स्थानीय समय के रूप में संग्रहीत एक सार्वभौमिक समय मान मिला है, तो निश्चित रूप से इसे बदल देगा (लेकिन उस मामले में, आपको निपटने के लिए बड़ी समस्याएं मिली हैं!) - वैसे भी, यह जवाब! भयानक। आपको "O"नीचे दिए गए उत्तर के अनुसार प्रारूप स्ट्रिंग का उपयोग करना चाहिए ।
BrainSlugs83

1
@ BrainSlugs83: यह "भयानक" जवाब वास्तव में ओपी क्या वे के लिए कहा देता है: 2009-09-01T00:00:00.000Z। "ओ" विनिर्देशक का उपयोग करते हुए उन्हें कुछ अलग देना होगा: 2009-09-01T00:00:00.0000000Z
ल्यूक


75

केवल गोल-यात्रा ("O", "o") प्रारूप विनिर्देशक का उपयोग क्यों नहीं करते ?

"O" या "O" मानक प्रारूप निर्दिष्टकर्ता एक पैटर्न का उपयोग करके एक कस्टम तिथि और समय प्रारूप स्ट्रिंग का प्रतिनिधित्व करता है जो समय क्षेत्र की जानकारी को संरक्षित करता है और एक परिणाम स्ट्रिंग का उत्सर्जन करता है जो आईएसओ 8601 का अनुपालन करता है। डेटाइम मानों के लिए, यह प्रारूप विनिर्देश तिथि निर्धारित करने के लिए डिज़ाइन किया गया है और पाठ में DateTime.Kind गुण के साथ समय मान। यदि स्वरूप पैरामीटर DateTimeStys.RoundtripKind पर सेट है, तो DateTime.Parse (स्ट्रिंग, IFormatProvider, DateTimeStyles) या DateTime.ParseExact विधि का उपयोग करके स्वरूपित स्ट्रिंग को वापस पार्स किया जा सकता है।

"O" या "o" मानक प्रारूप निर्दिष्टकर्ता "yyyy" - 'MM' - 'dd'T'HH': 'mm': 'ss' से मेल खाता है। ''ffffffK' 'DateTime मानों के लिए' 'कस्टम प्रारूप स्ट्रिंग' 'और' '। "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '।' fffffffzzz" DateTimeOffset मान के लिए कस्टम प्रारूप स्ट्रिंग। इस स्ट्रिंग में, एकल उद्धरण के जोड़े व्यक्तिगत वर्णों को चित्रित करते हैं, जैसे कि हाइफ़न, कॉलन और अक्षर "T", यह दर्शाता है कि व्यक्तिगत वर्ण एक शाब्दिक है जिसे बदला नहीं जा सकता है। एपोस्ट्रोफ आउटपुट स्ट्रिंग में दिखाई नहीं देते हैं।

ओ "या" ओ "मानक प्रारूप निर्दिष्टकर्ता (और" yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '।' fffffffK "कस्टम प्रारूप स्ट्रिंग) तीन तरीकों से लाभ उठाता है। आईएसओ 8601 डेटाइम मानों की प्रॉपर्टी को संरक्षित करने के लिए समय क्षेत्र की जानकारी का प्रतिनिधित्व करता है:

public class Example
{
   public static void Main()
   {
       DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                   DateTimeKind.Unspecified);
       Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); 

       DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                    DateTimeKind.Utc);
       Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind);

       DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                    DateTimeKind.Local);
       Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind);

       DateTimeOffset dto = new DateTimeOffset(lDat);
       Console.WriteLine("{0} --> {0:O}", dto);
   }
}
// The example displays the following output: 
//    6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 
//    6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z 
//    6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 
//     
//    6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00

क्योंकि यह अनुरोध के अनुसार काम नहीं करता है, आपने इसे सब के बाद उद्धृत किया है - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz" ज़ुलु प्रारूप नहीं है।
ज्योतिषी

@astrowalker यह काम करना चाहिए। उन्होंने अपने उत्तर में आपको कई विकल्प दिए। आपको केवल एक लेने की आवश्यकता है। आपके मामले में (और ओपी में), आप DateTimeKind.Utc का उपयोग अंत में "z" के साथ तार बनाने के लिए करेंगे (उर्फ "ज़ुलु प्रारूप" या "UTC टाइम")। यूटीसी के लिए बस उसका उदाहरण आउटपुट देखें। मेरे मामले में, मैंने उपयोग किया: dtVariable.ToUniversalTime().ToString("o")जो "2019-05-26T19:50:34.4400000Z"या में परिवर्तित हो जाएगा "yyyy-MM-ddTHH:mm:ss.fffffffZ"। नोट: मैंने new Date(dtDateString).getTime()इसे जावास्क्रिप्ट विधि के साथ भी परीक्षण किया है और यह सही ढंग से इसके द्वारा उत्पादित तारीख स्ट्रिंग को पार्स करता है।
माइकेटीवी

@MikeTeeVee, मैं बता रहा था कि दिए गए समाधान काम नहीं करेंगे (डीटीओ के लिए)। उपयुक्त तरीका है dto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")। रिकॉर्ड के लिए, बस "o"ऑफसेट जोड़ता है, यह ज़ुलु प्रारूप नहीं है।
ज्योतिषी

1
एक स्ट्रिंग परिवर्तन करने की कोशिश करने वालों के लिए:$"{DateTime.UtcNow:O}"
टियागो सेसर ओलिवेरा

18
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)

रिटर्न 2017-02-10T08: 12: 39.483Z


6

उपयोग करने के लिए सबसे अच्छा प्रारूप "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '।' fffK" है।

यदि तारीख UTC है या समय-क्षेत्र (+ -hh: mm) यदि स्थानीय है तो स्ट्रिंग पर अंतिम K को 'Z' में बदल दिया जाएगा। ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )

जैसा कि ल्यूक ने कहा, टूयूनिवर्सटाइम का उपयोग करना अच्छा है यदि आप चाहते हैं कि सभी तिथियां यूटीसी होंगी।

अंतिम कोड है:

string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");

6

कुछ लोगों ने ध्यान दिलाया है कि 'ToUniversalTime' कुछ हद तक असुरक्षित है कि यह अनपेक्षित गलत समय फैलाव का कारण बन सकता है। उस पर विस्तार करना मैं एक समाधान का अधिक विस्तृत उदाहरण प्रदान कर रहा हूं। यहां का नमूना डेटटाइम ऑब्जेक्ट के लिए एक एक्सटेंशन बनाता है जो सुरक्षित रूप से एक यूटीसी डेटाइम रिटर्न करता है जहां आप वांछित के रूप में टोस्ट्रिंग का उपयोग कर सकते हैं…।

class Program
{
    static void Main(string[] args)
    {
        DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc);
        DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified);

        //Sample of an unintended mangle:
        //Prints "2016-06-01 10:17:00Z"
        Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u"));

        //Prints "2016 - 06 - 01 03:17:00Z"
        Console.WriteLine(dUtc.SafeUniversal().ToString("u"));

        //Prints "2016 - 06 - 01 03:17:00Z"
        Console.WriteLine(dUnspecified.SafeUniversal().ToString("u"));
    }
}

public static class ConvertExtensions
{
    public static DateTime SafeUniversal(this DateTime inTime)
    {
        return (DateTimeKind.Unspecified == inTime.Kind)
            ? new DateTime(inTime.Ticks, DateTimeKind.Utc)
            : inTime.ToUniversalTime();
    }
}

5

आप DateTimeOffset वर्ग का उपयोग करना चाहते हैं ।

var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L));
var stringDate = date.ToString("u");

क्षमा करें, मैंने मील के पत्थरों के साथ अपने मूल स्वरूपण को याद किया

var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

5

यह कोड मेरे लिए काम कर रहा है:

var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local);
var text = datetime.ToString("o");
Console.WriteLine(text);
--  2017-10-27T14:45:53.1750000+03:00

// datetime from string
var newDate = DateTime.ParseExact(text, "o", null);

-3

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

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture);

पहले पूछा गया प्रश्न


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