डेटटाइम ऑब्जेक्ट को देखते हुए, मुझे स्ट्रिंग प्रारूप में आईएसओ 8601 तिथि कैसे मिल सकती है?


789

दिया हुआ:

DateTime.UtcNow

मैं एक स्ट्रिंग कैसे प्राप्त कर सकता हूं जो आईएसओ 8601 -प्रतिरूप प्रारूप में समान मूल्य का प्रतिनिधित्व करता है?

ध्यान दें कि आईएसओ 8601 समान स्वरूपों को परिभाषित करता है। मैं जिस विशिष्ट प्रारूप की तलाश कर रहा हूं वह है:

yyyy-MM-ddTHH:mm:ssZ

जवाबों:


778

पाठकों को ध्यान दें: कई टिप्पणीकारों ने इस उत्तर में कुछ समस्याएं बताई हैं (विशेष रूप से पहले सुझाव से संबंधित)। अधिक जानकारी के लिए टिप्पणी अनुभाग देखें।

DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");

यह आपको 2008-09-22T13: 57: 31.2311892-04: 00 के समान तारीख देता है ।

एक और तरीका है:

DateTime.UtcNow.ToString("o");

जो आपको 2008-09-22T14: 01: 54.9571247Z देता है

निर्दिष्ट प्रारूप प्राप्त करने के लिए, आप इसका उपयोग कर सकते हैं:

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")

दिनांक समय प्रारूपण विकल्प


20
इन दिनों, ऐसा करना (एक ऑफसेट के साथ यूटीसी समय को प्रस्तुत करने की कोशिश करना, जो बहुत मायने नहीं रखता है) एक अपवाद फेंकता है। इसलिए, मैं दूसरों से सहमत हूं कि अपरिवर्तनीय संस्कृति के साथ "एस" प्रारूप शायद अधिक सही है। FYI करें फॉर्मेटैसेप्शन का संदेश है: "एक UTC डेटटाइम को एक ऐसे फॉर्मेट में टेक्स्ट में परिवर्तित किया जा रहा है जो केवल स्थानीय समय के लिए है। डेटाइम को कॉल करते समय ऐसा हो सकता है। 'z' फॉर्मेट स्पेसिफायर का उपयोग करते हुए, जिसमें स्थानीय समय क्षेत्र ऑफसेट शामिल होगा। आउटपुट में। "
टॉम लिन्ज़ा

9
मैं ऑस्ट्रेलिया में रहता हूं, और मेरे लिए मुझे ToString("yyyy-MM-ddTHH:mm:ssK")काम करने के लिए इसका उपयोग करना पड़ा (jquery timeago plugin जिसका मैं उपयोग कर रहा था)।
गोनेले

6
यदि आप dt.ToString("s") + dt.ToString("zzz")टाइमजोन ऑफसेट को शामिल करना चाहते हैं, तो यह करें: // 2013-12-05T07: 19: 04-08: 00
alekop

4
स्लैश (\ :) स्ट्रिंग के साथ समस्या का कारण बनता है ... स्ट्रिंग स्ट्रिंग का उपयोग करने के लिए एक @ वर्ण में रखें।
गीगी


361

DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)आपको वह देना चाहिए जो आप "एस" प्रारूप के रूप में देख रहे हैं, जिसे निर्दिष्ट करने योग्य दिनांक / समय पैटर्न के रूप में वर्णित किया गया है; आईएसओ 8601 के अनुरूप है।


34
मेरा मानना ​​है कि यह सही उत्तर है। यह स्पष्ट रूप से yyyy-MM-etc को परिभाषित करने का कोई मतलब नहीं है यदि Microsoft ने पहले से ही आईएसओ 8601 को लागू किया है। Iain की प्रतिक्रिया भी सही थी, लेकिन आपको हमेशा कई कारणों से InvariantCulture (या किसी अन्य CultureInfo) को निर्दिष्ट करना चाहिए (अर्थात कभी भी .NET नहीं मानना ​​चाहिए। बस मान लीजिए)। आप यह भी उपयोग कर सकते हैं: DateTime.UtcNow.ToString(CultureInfo.InvariantCulture.DateTimeFormat.SortableDateTimePattern); हालाँकि, चूंकि ये सभी टाइम ज़ोन आदि को बाहर करते हैं, इसलिए आपके पास स्पष्ट फॉर्मैटर का उपयोग करने के अलावा कोई विकल्प नहीं हो सकता है, अर्थात"yyyy-MM-ddTHH:mm:ss.fffZ"
जॉन डेविस

20
जब यह अनुरूप हो जाता है, तो यह टाइमजोन को छोड़ देता है, Zइस तरह दिख रहा है: DateTime.UtcNow.ToString(c, CultureInfo.InvariantCulture)) => 2012-06-26T11:55:36और कोई मिलीसेकंड रिज़ॉल्यूशन नहीं है जो कि बहुत अच्छा है क्योंकि कंप्यूटर प्रति सेकंड एक उचित संख्या में टिक करते हैं।
हेनरिक

9
आपके साथ अर्थ सेकेंड oमिलते हैं , इसलिए आप एक सेकंड के लिए रिज़ॉल्यूशन प्राप्त करते हैं । ISO8601 से: 20042012-06-26T11:55:36.1007668Z36.10076681/10^7If a decimal fraction is included, lower order time elements (if any) shall be omitted and the decimal fraction shall be divided from the integer part by the decimal sign [...] the comma (,) or full stop (.)
हेनरिक


2
@ बिंकी - अब मैं बहुत कन्फ्यूज्ड हूं। SortableDateTimePattern के लिए मैंने पहले जो दस्तावेज जोड़ा था , उसके अनुसार, यह कहता है कि यह संस्कृति विशिष्ट होना चाहिए। फिर भी, यह अपने स्वयं के उदाहरणों के विपरीत है (क्योंकि वे सभी एक जैसे दिखते हैं); कोशिश करो DateTime.Now.ToString("s", new CultureInfo(myCulture))
drzaus

87
DateTime.UtcNow.ToString("s")

2008-04-10T06: 30: 00 जैसा कुछ देता है

UtcNowस्पष्ट रूप से एक यूटीसी समय देता है ताकि इसमें कोई नुकसान न हो:

string.Concat(DateTime.UtcNow.ToString("s"), "Z")

11
बस ब्याज से बाहर: क्यों string.Concat () '+' के बजाय?
डैनियल फोर्टुनोव 14

2
हैबिट, क्या कोई अंतर है?
इयान

84
@ कोंज़ोमर्स: मुझे नहीं लगता कि यह सही है। मुझे लगता a + bहै कि एक ही मध्यवर्ती कोड के रूप में संकलित किया जाता है string.Concat(a, b)(यह मानते हुए कि ए और बी तार हैं, निश्चित रूप से) इसलिए प्रदर्शन या स्मृति खपत में कोई अंतर नहीं है।
मार्क बायर्स

78
हाँ, मार्क सही है। Koen, आप अभी भी एक बेतुके समय से पहले सूक्ष्म अनुकूलन के जाल में गिर गए हैं, भले ही आप सही हों।
नोल्डोरिन

7
@ greg84: ठीक है, आप पूरी तरह से सही नहीं हैं। Microsoft वास्तुकार रिको मरिअनी की इस पोस्ट को देखें: blogs.msdn.com/b/ricom/archive/2003/12/15/43628.aspx - वे कहते हैं कि a + b संक्षिप्त रूप से संकलन करता है + उचित उपयोग के लिए कुछ और जानकारी है StringBuilder।
श्रीवास्तव

37

उपयोग:

private void TimeFormats()
{
    DateTime localTime = DateTime.Now;
    DateTime utcTime = DateTime.UtcNow;
    DateTimeOffset localTimeAndOffset = new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));

    //UTC
    string strUtcTime_o = utcTime.ToString("o");
    string strUtcTime_s = utcTime.ToString("s");
    string strUtcTime_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Local
    string strLocalTimeAndOffset_o = localTimeAndOffset.ToString("o");
    string strLocalTimeAndOffset_s = localTimeAndOffset.ToString("s");
    string strLocalTimeAndOffset_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Output
    Response.Write("<br/>UTC<br/>");
    Response.Write("strUtcTime_o: " + strUtcTime_o + "<br/>");
    Response.Write("strUtcTime_s: " + strUtcTime_s + "<br/>");
    Response.Write("strUtcTime_custom: " + strUtcTime_custom + "<br/>");

    Response.Write("<br/>Local Time<br/>");
    Response.Write("strLocalTimeAndOffset_o: " + strLocalTimeAndOffset_o + "<br/>");
    Response.Write("strLocalTimeAndOffset_s: " + strLocalTimeAndOffset_s + "<br/>");
    Response.Write("strLocalTimeAndOffset_custom: " + strLocalTimeAndOffset_custom + "<br/>");

}

आउटपुट

UTC
    strUtcTime_o: 2012-09-17T22:02:51.4021600Z
    strUtcTime_s: 2012-09-17T22:02:51
    strUtcTime_custom: 2012-09-17T22:02:51Z

Local Time
    strLocalTimeAndOffset_o: 2012-09-17T15:02:51.4021600-07:00
    strLocalTimeAndOffset_s: 2012-09-17T15:02:51
    strLocalTimeAndOffset_custom: 2012-09-17T22:02:51Z

सूत्रों का कहना है:


2
ऐसा लगता है कि आप स्थानीय रिवाज की नकल के शिकार हैं;; string strLocalTimeAndOffset_custom = localTimeAndOffset.ToString("yyyy-MM-ddTHH:mm:ssK");इसका परिणाम होगा:strLocalTimeAndOffset_custom: 2012-09-17T22:02:51-07:00
होली

33
System.DateTime.UtcNow.ToString("o")

=>

val it : string = "2013-10-13T13:03:50.2950037Z"

सहमत यह एकमात्र तरीका है कि आप पूरी तरह से सुनिश्चित हों कि आपके पास किसी भी समय के लिए एक स्पष्ट तारीख / समय है
मैट विल्को

23

आप अगले कोड के साथ "Z" ( ISO 8601 UTC ) प्राप्त कर सकते हैं :

Dim tmpDate As DateTime = New DateTime(Now.Ticks, DateTimeKind.Utc)
Dim res as String = tmpDate.toString("o") '2009-06-15T13:45:30.0000000Z


यहाँ क्यों है:

आईएसओ 8601 में कुछ अलग प्रारूप हैं:

DateTimeKind.Local

2009-06-15T13:45:30.0000000-07:00

DateTimeKind.Utc

2009-06-15T13:45:30.0000000Z

DateTimeKind.Unspecified

2009-06-15T13:45:30.0000000


.NET हमें उन विकल्पों के साथ एक एनम प्रदान करता है:

'2009-06-15T13:45:30.0000000-07:00
Dim strTmp1 As String = New DateTime(Now.Ticks, DateTimeKind.Local).ToString("o")

'2009-06-15T13:45:30.0000000Z
Dim strTmp2 As String = New DateTime(Now.Ticks, DateTimeKind.Utc).ToString("o")

'2009-06-15T13:45:30.0000000
Dim strTmp3 As String = New DateTime(Now.Ticks, DateTimeKind.Unspecified).ToString("o")

नोट : यदि आप Visual Studio 2008 "वॉच यूटिलिटी" को स्ट्रींग ("ओ") पर लागू करते हैं भाग पर लागू करते हैं, तो आपको अलग-अलग परिणाम मिल सकते हैं, मुझे नहीं पता कि यह बग है, लेकिन इस मामले में आपके पास स्ट्रिंग चर का उपयोग करके बेहतर परिणाम हैं अगर आप डिबगिंग कर रहे हैं।

स्रोत: मानक तिथि और समय प्रारूप स्ट्रिंग्स (MSDN)


20

यदि आपको ISO 8601 के लिए DateTime का उपयोग करना चाहिए, तो ToString ("o") को वह प्राप्त करना चाहिए जो आप खोज रहे हैं। उदाहरण के लिए,

2015-07-06T12:08:27

हालाँकि, DateTime + TimeZone अन्य समस्याओं को प्रस्तुत कर सकता है जैसा कि ब्लॉग पोस्ट में वर्णित है। DateTime और DateTimeOffset .NET में: अच्छी प्रथाओं और सामान्य नुकसान :

डेटटाइम में इसमें अनगिनत जाल हैं जो आपके कोड बग्स को देने के लिए डिज़ाइन किए गए हैं:

1.- DateTimeKind.Unspecified के साथ दिनांक मान खराब समाचार हैं।

2.- डेटटाइम तुलना करते समय UTC / स्थानीय के बारे में परवाह नहीं करता है।

3.- डेटाइम मान मानक प्रारूप के तार के बारे में नहीं जानते हैं।

4.- डेटाइम के साथ UTC मार्कर वाले स्ट्रिंग को पार्स करना UTC समय की गारंटी नहीं देता है।


2
ISO8601 का उपयोग स्ट्रवा में एक के लिए किया जाता है। हालाँकि कृपया उपयोग करें: StartTime.ToString ("yyyy-MM-ddTHH: mm: ssZ") बजाय ToString ("o") जो मिलीसेकंड आदि जोड़ता है
peterincumbria

2
मेरे लिए, "yyyy-MM-dd-THH: mm: ssZ" का शाब्दिक अर्थ "Z" है जो मेरे स्ट्रिंग के अंत में टाइमज़ोन मार्कर के बजाय होता है, जो कि मैं जो चाहता था वह नहीं किया। ToString ("ओ") वास्तव में वही किया जो मुझे चाहिए था, बहुत आसान और छोटा।
ब्लेयर कोनोली

18

आश्चर्य है कि किसी ने भी इसका सुझाव नहीं दिया:

System.DateTime.UtcNow.ToString("u").Replace(' ','T')
# Using PowerShell Core to demo

# Lowercase "u" format
[System.DateTime]::UtcNow.ToString("u")
> 2020-02-06 01:00:32Z

# Lowercase "u" format with replacement
[System.DateTime]::UtcNow.ToString("u").Replace(' ','T')
> 2020-02-06T01:00:32Z

UniversalSortableDateTimePattern आप आप क्या चाहते करने के लिए लगभग सभी तरह हो जाता है (जो और अधिक एक है आरएफसी 3339 प्रतिनिधित्व)।


जोड़ा गया: मैंने उन बेंचमार्क का उपयोग करने का निर्णय लिया जो उत्तर में थे https://stackoverflow.com/a/43793679/653058 यह तुलना करने के लिए कि यह कैसे प्रदर्शन करता है।

tl: डॉ; यह महंगा अंत में है, लेकिन अभी भी मेरे गंदे पुराने लैपटॉप पर आधा मिलीसेकंड से थोड़ा अधिक है :-)

कार्यान्वयन:

[Benchmark]
public string ReplaceU()
{
   var text = dateTime.ToUniversalTime().ToString("u").Replace(' ', 'T');
   return text;
}

परिणाम:

// * Summary *

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.19002
Intel Xeon CPU E3-1245 v3 3.40GHz, 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100
  [Host]     : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
  DefaultJob : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT


|               Method |     Mean |     Error |    StdDev |
|--------------------- |---------:|----------:|----------:|
|           CustomDev1 | 562.4 ns | 11.135 ns | 10.936 ns |
|           CustomDev2 | 525.3 ns |  3.322 ns |  3.107 ns |
|     CustomDev2WithMS | 609.9 ns |  9.427 ns |  8.356 ns |
|              FormatO | 356.6 ns |  6.008 ns |  5.620 ns |
|              FormatS | 589.3 ns |  7.012 ns |  6.216 ns |
|       FormatS_Verify | 599.8 ns | 12.054 ns | 11.275 ns |
|        CustomFormatK | 549.3 ns |  4.911 ns |  4.594 ns |
| CustomFormatK_Verify | 539.9 ns |  2.917 ns |  2.436 ns |
|             ReplaceU | 615.5 ns | 12.313 ns | 11.517 ns |

// * Hints *
Outliers
  BenchmarkDateTimeFormat.CustomDev2WithMS: Default     -> 1 outlier  was  removed (668.16 ns)
  BenchmarkDateTimeFormat.FormatS: Default              -> 1 outlier  was  removed (621.28 ns)
  BenchmarkDateTimeFormat.CustomFormatK: Default        -> 1 outlier  was  detected (542.55 ns)
  BenchmarkDateTimeFormat.CustomFormatK_Verify: Default -> 2 outliers were removed (557.07 ns, 560.95 ns)

// * Legends *
  Mean   : Arithmetic mean of all measurements
  Error  : Half of 99.9% confidence interval
  StdDev : Standard deviation of all measurements
  1 ns   : 1 Nanosecond (0.000000001 sec)

// ***** BenchmarkRunner: End *****

1
"ओ" का स्वीकृत उत्तर काम करता है, लेकिन यह सटीक (geez .XXXXXXX सेकंड) की कष्टप्रद मात्रा देता है, जबकि मैं इसे पसंद करता हूं क्योंकि यह सेकंड में बंद हो जाता है।
झूकना

यह भी कि डॉक्टर का दावा है "यू" आईएसओ 8601 है, लेकिन टी के बजाय अंतरिक्ष के साथ क्या है? इसे एक साथ
मिलाएं

यदि आप इसके माध्यम से पढ़ते हैं तो @jhocking en.wikipedia.org/wiki/ISO_8601#cite_note-30 ISO 8601 अपेक्षाकृत अनुज्ञेय है ...
rburte

16

मैं सिर्फ उपयोग करेगा XmlConvert:

XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);

यह समय क्षेत्र को स्वचालित रूप से संरक्षित करेगा।


मैंने आगे बढ़कर एक एक्सटेंशन विधि जोड़ी। सार्वजनिक स्थैतिक वर्ग DateTimeExtensions {सार्वजनिक स्थैतिक स्ट्रिंग ToIsoFormat (यह DateTime DateTime) {रिटर्न XmlConvert.ToString (दिनांक समय, XmlDateTimeSerializationMode.RoundtripKind); }}
बजे

14

इनमें से अधिकांश उत्तरों में मिलीसेकंड / माइक्रोसेकंड हैं जो स्पष्ट रूप से आईएसओ 8601 द्वारा समर्थित नहीं हैं। सही उत्तर होगा:

System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");
// or
System.DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");

संदर्भ:


15
"टाइम्स" के तहत अपना खुद का विकिपीडिया लिंक पढ़ें। इसमें "दशमलव अंश" का उल्लेख है, जिसका अर्थ है आईएसओ 8601 दोनों मिलीसेकंड और माइक्रोसेकंड का समर्थन करता है (लेकिन संचार करने वाले पक्ष स्वीकृत दशमलव स्थानों की संख्या को सीमित कर सकते हैं)।
सोरेन बोइसन

11
DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz");

DateTime.Now.ToString("O");

नोट: आप अपने अंत में जो रूपांतरण कर रहे हैं, उसके आधार पर आप पहली पंक्ति का उपयोग कर रहे हैं (अधिकांश इसे पसंद करेंगे) या दूसरा।

केवल स्थानीय समय पर ही लागू प्रारूप को सुनिश्चित करें, क्योंकि "ज़ज़" यूटीसी रूपांतरण के लिए समय क्षेत्र की जानकारी है।

छवि


मुझे यकीन नहीं है कि # क्रिसहाइन्स क्योंकि वह मेरे द्वारा कोड की पहली पंक्ति के बारे में किए गए सुझाव के बारे में पूछ रहा है, लेकिन अगर आप सही हैं और यही स्थिति "जवाब" है
PSM

9

"s"मानक फॉर्मेट स्पेसिफायर एक कस्टम दिनांक और समय प्रारूप स्ट्रिंग है कि द्वारा परिभाषित किया गया है का प्रतिनिधित्व करता है DateTimeFormatInfo.SortableDateTimePattern संपत्ति। पैटर्न एक परिभाषित मानक ( आईएसओ 8601 ) को दर्शाता है , और संपत्ति केवल पढ़ने के लिए है। इसलिए, यह हमेशा समान होता है, भले ही इस्तेमाल की गई संस्कृति या आपूर्ति किए गए प्रारूप प्रदाता की परवाह किए बिना। कस्टम प्रारूप स्ट्रिंग है"yyyy'-'MM'-'dd'T'HH':'mm':'ss"

जब यह मानक प्रारूप विनिर्देशक का उपयोग किया जाता है, तो स्वरूपण या पार्सिंग ऑपरेशन हमेशा अपरिवर्तनीय संस्कृति का उपयोग करता है।

- MSDN से


1
तो इसका उपयोग करना ठीक है .ToString("s")?
अहमत -

मुझे ऐसा विश्वास है। - जब तक आपकी आवश्यकता मूल प्रश्न से मेल खाती है .. लेकिन सिमोन विल्सन द्वारा चेतावनी पर एक नज़र डालें
अमल

9

DateTime.UtcNow को yyyy-MM-ddTHH: mm: ssZ के स्ट्रिंग प्रतिनिधित्व में बदलने के लिए , आप कस्टम स्वरूपण स्ट्रिंग के साथ डेटटाइम संरचना की ToString () विधि का उपयोग कर सकते हैं। डेटाइम के साथ कस्टम प्रारूप स्ट्रिंग्स का उपयोग करते समय, यह याद रखना महत्वपूर्ण है कि आपको एकल उद्धरणों का उपयोग करके अपने सेपरेटर से बचने की आवश्यकता है।

निम्नलिखित स्ट्रिंग रिप्रेसन को वापस करेगा जिसे आप चाहते थे:

DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)

9

यह दिलचस्प है कि कस्टम प्रारूप "yyyy-MM-ddTHH: mm: ssK" (एमएस के बिना) सबसे तेज प्रारूप विधि है।

यह भी दिलचस्प है कि "एस" प्रारूप क्लासिक पर धीमा है और कोर पर तेज ...

बेशक संख्या बहुत करीब हैं, कुछ पंक्तियों के अंतर के बीच महत्वहीन है (प्रत्यय के साथ परीक्षण _Verifyसमान हैं जो कि बिना उस प्रत्यय के हैं, परिणाम दोहराव प्रदर्शित करता है)

BenchmarkDotNet=v0.10.5, OS=Windows 10.0.14393
Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4
Frequency=3233539 Hz, Resolution=309.2587 ns, Timer=TSC
  [Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
  Clr    : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
  Core   : .NET Core 4.6.25009.03, 64bit RyuJIT


               Method |  Job | Runtime |       Mean |     Error |    StdDev |     Median |        Min |        Max | Rank |  Gen 0 | Allocated |
--------------------- |----- |-------- |-----------:|----------:|----------:|-----------:|-----------:|-----------:|-----:|-------:|----------:|
           CustomDev1 |  Clr |     Clr | 1,089.0 ns | 22.179 ns | 20.746 ns | 1,079.9 ns | 1,068.9 ns | 1,133.2 ns |    8 | 0.1086 |     424 B |
           CustomDev2 |  Clr |     Clr | 1,032.3 ns | 19.897 ns | 21.289 ns | 1,024.7 ns | 1,000.3 ns | 1,072.0 ns |    7 | 0.1165 |     424 B |
     CustomDev2WithMS |  Clr |     Clr | 1,168.2 ns | 16.543 ns | 15.474 ns | 1,168.5 ns | 1,149.3 ns | 1,189.2 ns |   10 | 0.1625 |     592 B |
              FormatO |  Clr |     Clr | 1,563.7 ns | 31.244 ns | 54.721 ns | 1,532.5 ns | 1,497.8 ns | 1,703.5 ns |   14 | 0.2897 |     976 B |
              FormatS |  Clr |     Clr | 1,243.5 ns | 24.615 ns | 31.130 ns | 1,229.3 ns | 1,200.6 ns | 1,324.2 ns |   13 | 0.2865 |     984 B |
       FormatS_Verify |  Clr |     Clr | 1,217.6 ns | 11.486 ns | 10.744 ns | 1,216.2 ns | 1,205.5 ns | 1,244.3 ns |   12 | 0.2885 |     984 B |
        CustomFormatK |  Clr |     Clr |   912.2 ns | 17.915 ns | 18.398 ns |   916.6 ns |   878.3 ns |   934.1 ns |    4 | 0.0629 |     240 B |
 CustomFormatK_Verify |  Clr |     Clr |   894.0 ns |  3.877 ns |  3.626 ns |   893.8 ns |   885.1 ns |   900.0 ns |    3 | 0.0636 |     240 B |
           CustomDev1 | Core |    Core |   989.1 ns | 12.550 ns | 11.739 ns |   983.8 ns |   976.8 ns | 1,015.5 ns |    6 | 0.1101 |     423 B |
           CustomDev2 | Core |    Core |   964.3 ns | 18.826 ns | 23.809 ns |   954.1 ns |   935.5 ns | 1,015.6 ns |    5 | 0.1267 |     423 B |
     CustomDev2WithMS | Core |    Core | 1,136.0 ns | 21.914 ns | 27.714 ns | 1,138.1 ns | 1,099.9 ns | 1,200.2 ns |    9 | 0.1752 |     590 B |
              FormatO | Core |    Core | 1,201.5 ns | 16.262 ns | 15.211 ns | 1,202.3 ns | 1,178.2 ns | 1,225.5 ns |   11 | 0.0656 |     271 B |
              FormatS | Core |    Core |   993.5 ns | 19.272 ns | 24.372 ns |   999.4 ns |   954.2 ns | 1,029.5 ns |    6 | 0.0633 |     279 B |
       FormatS_Verify | Core |    Core | 1,003.1 ns | 17.577 ns | 16.442 ns | 1,009.2 ns |   976.1 ns | 1,024.3 ns |    6 | 0.0674 |     279 B |
        CustomFormatK | Core |    Core |   878.2 ns | 17.017 ns | 20.898 ns |   877.7 ns |   851.4 ns |   928.1 ns |    2 | 0.0555 |     215 B |
 CustomFormatK_Verify | Core |    Core |   863.6 ns |  3.968 ns |  3.712 ns |   863.0 ns |   858.6 ns |   870.8 ns |    1 | 0.0550 |     215 B |

कोड:

    public class BenchmarkDateTimeFormat
    {
        public static DateTime dateTime = DateTime.Now;

        [Benchmark]
        public string CustomDev1()
        {
            var d = dateTime.ToUniversalTime();
            var sb = new StringBuilder(20);

            sb.Append(d.Year).Append("-");
            if (d.Month <= 9)
                sb.Append("0");
            sb.Append(d.Month).Append("-");
            if (d.Day <= 9)
                sb.Append("0");
            sb.Append(d.Day).Append("T");
            if (d.Hour <= 9)
                sb.Append("0");
            sb.Append(d.Hour).Append(":");
            if (d.Minute <= 9)
                sb.Append("0");
            sb.Append(d.Minute).Append(":");
            if (d.Second <= 9)
                sb.Append("0");
            sb.Append(d.Second).Append("Z");
            var text = sb.ToString();
            return text;
        }

        [Benchmark]
        public string CustomDev2()
        {
            var u = dateTime.ToUniversalTime();
            var sb = new StringBuilder(20);
            var y = u.Year;
            var d = u.Day;
            var M = u.Month;
            var h = u.Hour;
            var m = u.Minute;
            var s = u.Second;
            sb.Append(y).Append("-");
            if (M <= 9)
                sb.Append("0");
            sb.Append(M).Append("-");
            if (d <= 9)
                sb.Append("0");
            sb.Append(d).Append("T");
            if (h <= 9)
                sb.Append("0");
            sb.Append(h).Append(":");
            if (m <= 9)
                sb.Append("0");
            sb.Append(m).Append(":");
            if (s <= 9)
                sb.Append("0");
            sb.Append(s).Append("Z");
            var text = sb.ToString();
            return text;
        }

        [Benchmark]
        public string CustomDev2WithMS()
        {
            var u  = dateTime.ToUniversalTime();
            var sb = new StringBuilder(23);
            var y  = u.Year;
            var d  = u.Day;
            var M  = u.Month;
            var h  = u.Hour;
            var m  = u.Minute;
            var s  = u.Second;
            var ms = u.Millisecond;
            sb.Append(y).Append("-");
            if (M <= 9)
                sb.Append("0");
            sb.Append(M).Append("-");
            if (d <= 9)
                sb.Append("0");
            sb.Append(d).Append("T");
            if (h <= 9)
                sb.Append("0");
            sb.Append(h).Append(":");
            if (m <= 9)
                sb.Append("0");
            sb.Append(m).Append(":");
            if (s <= 9)
                sb.Append("0");
            sb.Append(s).Append(".");
            sb.Append(ms).Append("Z");
            var text = sb.ToString();
            return text;
        }
        [Benchmark]
        public string FormatO()
        {
            var text = dateTime.ToUniversalTime().ToString("o");
            return text;
        }
        [Benchmark]
        public string FormatS()
        {
            var text = string.Concat(dateTime.ToUniversalTime().ToString("s"),"Z");
            return text;
        }

        [Benchmark]
        public string FormatS_Verify()
        {
            var text = string.Concat(dateTime.ToUniversalTime().ToString("s"), "Z");
            return text;
        }

        [Benchmark]
        public string CustomFormatK()
        {
            var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
            return text;
        }

        [Benchmark]
        public string CustomFormatK_Verify()
        {
            var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
            return text;
        }
    }

https://github.com/dotnet/BenchmarkDotNet का उपयोग किया गया था



2

यदि आप SharePoint 2010 या उच्चतर के तहत विकसित कर रहे हैं, तो आप उपयोग कर सकते हैं

using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)

20
SharePoint, जब आपका .net पर्याप्त जावा नहीं है।
हेनरिक

18
इसके लिए SharePoint का उपयोग करना एक तरह का होता है जैसे जेली का टब लाना, माचिस की तीली का गीला बॉक्स और बंदूक की लड़ाई के लिए 2 ट्रेपेज़-वॉकिंग चिंपांज़ी।
नथानचेरे

SharePoint में भी उम्मीद है कि आप BCL .ToString("o")या, बेहतर, का उपयोग कर सकते हैं $"My complicated string {dt:o}"
बिंकी

2

2018-06-22T13 जैसे प्रारूप के लिए : 04: 16 जो एक एपीआई उपयोग के यूआरआई में पारित किया जा सकता है:

public static string FormatDateTime(DateTime dateTime)
{
    return dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture);
}

1
मुझे लगता है कि यह आईएसओ तारीख स्ट्रिंग प्रति परिभाषा संस्कृति अपरिवर्तनीय है।
जोनास

1

जैसा कि अन्य उत्तर में बताया गया है, DateTime डिजाइन द्वारा मुद्दे हैं।

NodaTime

मैं दिनांक / समय मानों को प्रबंधित करने के लिए NodaTime का उपयोग करने का सुझाव देता हूं :

  • स्थानीय समय, तिथि, तिथि
  • वैश्विक समय
  • समयक्षेत्र के साथ समय
  • अवधि
  • अवधि

का प्रारूपण

तो, ZonedDateTimeआप निम्न कोड स्निपेट का उपयोग कर सकते हैं और बनाने के लिए :

var instant1 = Instant.FromUtc(2020, 06, 29, 10, 15, 22);

var utcZonedDateTime = new ZonedDateTime(instant1, DateTimeZone.Utc);
utcZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T10:15:22Z


var instant2 = Instant.FromDateTimeUtc(new DateTime(2020, 06, 29, 10, 15, 22, DateTimeKind.Utc));

var amsterdamZonedDateTime = new ZonedDateTime(instant2, DateTimeZoneProviders.Tzdb["Europe/Amsterdam"]);
amsterdamZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T12:15:22Z

मेरे लिए NodaTimeकोड काफी वर्बोज़ लगता है। लेकिन प्रकार वास्तव में उपयोगी हैं। वे दिनांक / समय मानों को सही ढंग से संभालने में मदद करते हैं।

Newtonsoft.Json

का उपयोग करने के NodaTimeसाथ Newtonsoft.Jsonआप के लिए संदर्भ जोड़ने की जरूरत है NodaTime.Serialization.JsonNetNuGet पैकेज और कॉन्फ़िगर JSON विकल्प।

services
    .AddMvc()
    .AddJsonOptions(options =>
    {
        var settings=options.SerializerSettings;
        settings.DateParseHandling = DateParseHandling.None;
        settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
    });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.