डेटटाइम परिवर्तित करें? तार


11

मैं एक DateTime?स्ट्रिंग में परिवर्तित करना चाहते हैं । यदि कोई तिथि शून्य है, तो वापस लौटें "", अन्यथा इस तरह एक स्ट्रिंग प्रारूप लौटाएँ "2020-03-05T07:52:59.665Z":। कोड कुछ इस तरह है, लेकिन यह काम नहीं करेगा। यह कहा कि "DateTime?""ToUniversalTime" के लिए परिभाषा नहीं है। किसी को पता है कि इसे कैसे ठीक करना है?

DateTime? date = DateTime.UtcNow;

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

1
वैसे, क्या आप बस चाहते हैं .ToString("o")?
— जॉन

ओह, मैं पहले से ही DateTime.UTCNow का उपयोग करता हूं इसलिए मुझे अब ToUniversalTime () का उपयोग करने की आवश्यकता नहीं है? @ जॉन। आह, मैं देखता हूं .ToString("o"), मैं और अधिक शोध करूंगा। धन्यवाद!
— कैमाहे

1
वास्तव में, और मान लें कि आप केवल ISO8601 प्रारूप चाहते हैं, तो आप "ओ" का उपयोग कर सकते हैं। डॉक्स
— जॉन

@ जॉन: "ओ" टिक परिशुद्धता का उपयोग करता है, जो आईएसओ -0101 अनुरूप होने के बावजूद वांछनीय नहीं हो सकता है।
— जॉन स्कीट

1
"लेकिन जब मैं उपयोग करता हूँ .ToString (" ओ "), इसमें Z नहीं है" - यह होगा यदि आप अभी भी ToUniversalTime () कहते हैं; 'Z' एक प्रकार का UTC होने से आता है।
— जॉन स्कीट

जवाबों:


16

द डेटटाइम? एक मूल्य संपत्ति और एक HasValue संपत्ति है

प्रयत्न:

var dateInUTCString = date.HasValue ? date.Value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'") : "";

आप लघु संस्करण का उपयोग कर सकते हैं:

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

8

जबकि आप Valueसंपत्ति का उपयोग सीधे लेसज़ेक के जवाब के अनुसार कर सकते हैं , मैं शायद अशक्त-संचालक ऑपरेटर के साथ मिलकर अशक्त-संचालक ऑपरेटर का उपयोग करूंगा:

string dateInUTCString =
    date?.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture) 
    ?? "";

यहां ?.केवल शून्य मान होने पर परिणाम dateशून्य हो जाएगा, और कॉल का ??परिणाम date?.ToUniversalTime().ToString(...)शून्य होने पर ऑपरेटर डिफ़ॉल्ट रूप से मान प्रदान करेगा (जो केवल तभी होगा यदि dateशून्य है)।

ध्यान दें कि आप वास्तव में अपरिवर्तनीय संस्कृति को निर्दिष्ट करना चाहते हैं ताकि अप्रत्याशित परिणाम प्राप्त करने से बचें जब वर्तमान थ्रेड की संस्कृति ग्रेगोरियन कैलेंडर का उपयोग नहीं करती है, और आपको प्रारूप स्ट्रिंग में उन सभी शाब्दिकों को उद्धृत करने की आवश्यकता नहीं है। जब आप ऐसा करते हैं तो यह निश्चित रूप से काम करता है, लेकिन IMO को पढ़ना कठिन होता है।

यदि आपको कोई आपत्ति नहीं है कि स्ट्रिंग में कितनी सटीकता है, तो आप "O" मानक प्रारूप स्ट्रिंग का उपयोग करके कोड को सरल बना सकते हैं :

string dateInUTCString = date?.ToUniversalTime().ToString("O") ?? "";

उस बिंदु पर आपको यह निर्दिष्ट करने की आवश्यकता नहीं है CultureInfo.InvariantCultureकि इसका उपयोग हमेशा "O" द्वारा किया जाता है।


1
"O"प्रारूप स्ट्रिंग के रूप में उपयोग क्यों नहीं किया जाता है? docs.microsoft.com/en-us/dotnet/standard/base-types/...
— ज़ोहर

1
@ZoharPeled: इसमें टिक परिशुद्धता है, और ओपी जाहिर तौर पर केवल मिलीसेकंड परिशुद्धता चाहता है।
— जॉन स्कीट

वास्तव में मैं एक प्रारूप चाहता हूं जो Zस्ट्रिंग
— कैमाहे

1
@camahe: "O" प्रारूप निर्दिष्ट पहले से ही उपयोग करता है - ज़ोहर द्वारा पोस्ट किए गए दस्तावेज़ लिंक देखें। यदि आप वास्तव में यह नहीं समझते हैं कि "O" का उपयोग करने पर आपको कितने अंक की सटीकता प्राप्त होगी, तो यह बहुत सरल होगा - आपको उस मामले में CultureInfo.InvariantCulture निर्दिष्ट करने की आवश्यकता नहीं होगी। विकल्प के रूप में इसे जोड़ने के लिए उत्तर में संशोधन करेंगे।
— जॉन स्कीट

2
@ कैमे: कृपया इससे सबक लें कि जब आप कोई प्रश्न पूछते हैं, तो यह आपकी आवश्यकताओं में वास्तव में सटीक होने में मदद करता है ।
— जॉन स्कीट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.