DateTime.ToString ("MM / dd / yyyy HH: mm: ss.fff") "09/14/2013 07.20.31.371" के परिणामस्वरूप कुछ हुआ।


131

मेरे पास एक WP8 ऐप है, जो वर्तमान समय को एक वेब सेवा में भेज देगा।

मुझे कॉल करके डेटाटाइम स्ट्रिंग मिलती है

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")

अधिकांश उपयोगकर्ताओं के लिए यह बढ़िया काम करता है और मुझे सही स्ट्रिंग देता है जैसे "09/10/2013 04:04:31.415"। लेकिन कुछ उपयोगकर्ता के लिए परिणामी स्ट्रिंग कुछ ऐसी होती है "09/14/2013 07.20.31.371", जो मेरी वेब सेवा में समस्या का कारण बनती है।

क्या इसलिए कि कुछ संस्कृति प्रारूप मुद्दा है? मैं यह कैसे सुनिश्चित कर सकता हूं कि रिजल्ट स्ट्रिंग को डॉट के बजाय कोलोन द्वारा सीमांकित किया गया है?


2
एकमात्र अंतर कोलन बनाम डॉट है।
एल्डोरैडो

जवाबों:


244

क्या इसलिए कि कुछ संस्कृति प्रारूप मुद्दा है?

हाँ। आपका उपयोगकर्ता एक संस्कृति में होना चाहिए जहां समय विभाजक एक बिंदु है। दोनों ":" और "/" को संस्कृति-संवेदनशील तरीके से कस्टम दिनांक और समय स्वरूपों में व्याख्या किया जाता है

मैं यह कैसे सुनिश्चित कर सकता हूं कि रिजल्ट स्ट्रिंग को डॉट के बजाय कोलोन द्वारा सीमांकित किया गया है?

मैं निर्दिष्ट करना चाहूंगा CultureInfo.InvariantCulture:

string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture);

वैकल्पिक रूप से, आप समय और दिनांक विभाजकों को उद्धृत कर सकते हैं :

string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");

... लेकिन इससे आपको "रोचक" परिणाम मिलेंगे, जिनकी आपको उम्मीद नहीं है यदि आप उपयोगकर्ताओं को एक संस्कृति में चल रहे हैं जहां डिफ़ॉल्ट कैलेंडर सिस्टम ग्रेगोरियन कैलेंडर नहीं है। उदाहरण के लिए, निम्नलिखित कोड लें:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()        
    {
        DateTime now = DateTime.Now;
        CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
        Thread.CurrentThread.CurrentCulture = culture;
        Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
    }
} 

वह उत्पादन (18 सितंबर 2013 को) करता है:

11/12/1434 15:04:31.750

मेरा अनुमान है कि आपकी वेब सेवा इससे हैरान होगी!

मैं वास्तव में न केवल अपरिवर्तनीय संस्कृति का उपयोग करने का सुझाव दूंगा, बल्कि ISO-8601 तिथि प्रारूप में भी परिवर्तन करूंगा :

string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

यह अधिक विश्व स्तर पर स्वीकृत प्रारूप है - यह क्रमबद्ध भी है, और महीने और दिन के क्रम को स्पष्ट करता है। (जबकि 06/07/2013 को पाठक की संस्कृति के आधार पर 7 जून या 6 जुलाई को व्याख्या की जा सकती है।)


धन्यवाद जॉन। मैंने सोचा था कि परिणाम स्ट्रिंग बिल्कुल प्रारूप स्ट्रिंग की तरह होगा। मैं आपके सुझाव की कोशिश करूंगा।
एल्डोरैडो

3
बस एक छोटा सा विचार। किसी विशिष्ट कोड से एक कल्चरइन्फो ऑब्जेक्ट लोड करते समय मैं हमेशा useUserOverrideपैरामीटर को गलत पर सेट करने का सुझाव देता हूं , अन्यथा कुछ उपयोगकर्ता सेटिंग्स संस्कृति सेटिंग्स को ओवरराइड कर सकती हैं। उदाहरण के लिए आपके मामले में मैं नए का उपयोग करने का सुझाव देता हूं CultureInfo("ar-SA", false)
डेविड इकार्डी

@DavideIcardi: दिलचस्प है, धन्यवाद - हालांकि इस मामले में सऊदी अरब का उपयोग करने का उद्देश्य विशेष रूप से यह कहना था कि आक्रमणकारी संस्कृति का उपयोग करना शायद सही क्यों है। हालांकि भविष्य के पदों के लिए ध्यान में रखना होगा।
जॉन स्कीट

7
हाफवे ने इस व्यापक उत्तर को गर्त में डाल दिया, मैं सोचने लगा: क्या यह फिर से जॉन होगा? हां।
डेसपेयर की ग्रिमेस

Html.TextBoxFor (x => x.Date, "{0: MM / dd / yyyy}") के साथ समान प्रबंधन कैसे करें?
विस्मयादिबोधन

9

:इसका विशेष अर्थ है: यह समय विभाजक है। ( कस्टम तिथि और समय प्रारूप स्ट्रिंग्स )।

\इससे बचने के लिए उपयोग करें :

DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")

या उपयोग करें CultureInfo.InvariantCulture:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)

मैं दूसरे के साथ जाने का सुझाव दूंगा, क्योंकि /इसका विशेष अर्थ भी है (यह तिथि विभाजक है। ), इसलिए आपको इससे भी समस्या हो सकती है।


2
यह सिर्फ डेट सेपरेटर की समस्या नहीं है - वास्तविक संख्या को प्रभावित करने वाली संस्कृति के एक उदाहरण के लिए मेरा जवाब देखें, ...
जॉन स्कीट

1
\ N इसे से बच नहीं!
शेरेफ मरज़ौक

8

आप InvariantCulture का उपयोग कर सकते हैं क्योंकि आपका उपयोगकर्ता एक ऐसी संस्कृति में होना चाहिए जो एक बृहदान्त्र के बजाय डॉट का उपयोग करता है:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);

7

मैं इस समस्या से हाल ही में विंडोज 10 से एक और दिशा में टकराया, और इस समस्या को हल करने में @JonSkeet का उत्तर बहुत उपयोगी पाया।

मैंने एक परीक्षण प्रपत्र के साथ आगे अनुसंधान किया और पाया कि जब वर्तमान संस्कृति को रनटाइम ( "no"या ) "nb-NO"पर सेट किया गया था Thread.CurrentThread.CurrentCulture = new CultureInfo("no");, तोस्ट्रिंग ("yyyy-MM-dd HH: mm: ss") कॉल का विंडोज 7 में अलग तरह से जवाब दिया गया था और विंडोज 10. यह विंडोज 7 और HH.mm.ss में विंडोज 10 में मुझे जो उम्मीद थी, वह वापस मिल गया!

मुझे लगता है कि यह थोड़ा डरावना है! चूंकि मेरा मानना ​​था कि कम से कम किसी भी विंडोज संस्करण में एक संस्कृति थी।


मुझे यह जानने के लिए काफी उत्सुकता होगी कि यह वास्तव में क्या कारण है।
लॉरी पेल्टनन

2
इसे विंडोज 10 लोकोलाइजेशन बग के रूप में मान्यता और तय किया गया है। इसलिए क्लाइंट मशीन पर एक विंडोज़ अपडेट समस्या को ठीक करेगा। अधिक विवरण इस ब्लॉग पोस्ट में उपलब्ध हैं: heikniemi.net/hardcoded/2015/08/…
Håkon Seljåsen

जौनी हकीमनी का ब्लॉग, जिसे मैंने ऊपर से जोड़ा था, टूटा हुआ लगता है। प्रासंगिक विंडोज़ अपडेट जहां मुद्दे तय किए गए हैं, उन्हें वहां सूचीबद्ध किया गया है: 2015-10-09: KB3093266 - विंडोज 10 KB3088956 - विंडोज सर्वर 2012 R2 और विंडोज 8.1 केबी 3088955 - विंडोज सर्वर 2012 और विंडोज 8 केबी 3088957 - विंडोज 7 SP1, विंडोज सर्वर 2008 SP2 , Windows Server 2008 R2 SP1, और Windows Vista SP2 ब्लॉग को फिर से लिंक करने की कोशिश कर रहा है, इस बार यद्यपि
।.org

4

आप String.Format का उपयोग कर सकते हैं:

DateTime d = DateTime.Now;
string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond);
// I got this result: "02/23/2015 16:42:38.234"

0

स्ट्रिंग करने के लिए दिनांक परिवर्तित करें

स्पेस नाम का उपयोग करें

using System.Globalization;

कोड

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");

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