2010-05-11 11 views
6

मैं एक स्ट्रिंग इस तरह मिलीसेकेंड युक्त पार्स करने के लिए कोशिश कर रहा हूँ:मिलीसेकंड युक्त डेटटाइम को पार्स करना कुछ संस्कृतियों के लिए विफल रहता है। क्यूं कर?

string s = "11.05.2010 15:03:08.7718687"; // culture: de-CH 
DateTime d = DateTime.Parse(s); // works 

हालांकि, de-डे वातावरण के तहत उदाहरण के लिए, दशमलव विभाजक एक अल्पविराम (नहीं एक डॉट) है। इसलिए उदाहरण बन जाता है:

string s = "11.05.2010 15:03:08,7718687"; // culture: de-DE (note the comma) 
DateTime d = DateTime.Parse(s); // throws a FormatException 

यह मेरे लिए अजीब है कि DateTime.Parse (रों) अब एक FormatException फेंक के रूप में यह CultureInfo.CurrentCulture उपयोग करने के लिए पार्स करने के लिए माना जाता है चाहिए। यहां तक ​​कि वर्तमान संस्कृति को एक तर्क के रूप में पारित करने से स्पष्ट रूप से न तो मदद मिलती है। क्या किसी के पास कोई विचार है कि यह क्यों काम नहीं करता है? क्या पार्सिंग नंबरफॉर्मैटइन्फो नम्बरडिसिल सैपरेटर को खाते में नहीं लेती है?

+1

उप-दूसरे समय स्वरूपण मानकीकृत करने के कुछ दिन पहले (आईएसओ 8601: 2004 ने इसे किया), तो इससे कोई फर्क नहीं पड़ता कि विभाजक क्या था। इसलिए, मानक आमतौर पर कवर नहीं करते हैं जो उप-दूसरे समय के लिए दशमलव बिंदु के रूप में उपयोग किया जाना चाहिए। यह स्पष्ट नहीं है कि संख्यात्मक प्रारूप जानकारी सही है, लेकिन एक बेहतर विकल्प नहीं है। हम हाल ही में इस मुद्दे के साथ कुश्ती कर रहे हैं (एक पूरी तरह से अलग संदर्भ में - विंडोज प्लेटफॉर्म नहीं), और इसके लिए अभी तक एक अच्छी प्रणाली के साथ नहीं आया है। इसके अलावा पीछे की ओर (अनुकूल) संगतता हमें कुछ सिरदर्द दे रही है। –

उत्तर

4

डेटटाइमफॉर्मैट इंफो फॉर्मेटिंग/पार्सिंग तिथियों पर लागू होता है, न कि संख्या FormatInfo। DateTimeFormatInfo एक "सेकंड/मिलीसेकंड" विभाजक को परिभाषित नहीं करता है जिसे विभिन्न संस्कृतियों द्वारा ओवरलोड किया जा सकता है। Standard Date and Time format strings की

कोई नहीं, मिलीसेकंड प्रदर्शित गोल यात्रा है, जो संस्कृति के प्रति संवेदनशील होने के लिए वैसे भी प्रकट नहीं होता है के लिए छोड़कर। तो आपको उस प्रारूप में एक स्ट्रिंग पर नहीं होना चाहिए, जब तक कि आपका स्वयं का कोड उत्पन्न न हो जाए। यदि आप जानते हैं कि आपका कोड उस प्रारूप में तिथियां उत्पन्न करने जा रहा है, तो आप एक कस्टम प्रारूप स्ट्रिंग प्रदान कर सकते हैं जो अल्पविराम को सेकंड और मिलीसेकंड के बीच विभाजक के रूप में उपयोग करता है।

+2

वास्तव में, डेटटाइम को दर्शाते हुए। पर्स विधि अंततः इस कोड खंड को जन्म देती है: char ch2 = str.Value [str.Index]; अगर (ch2 == '।') { पार्सफ्रेक्शन (रेफ स्ट्र, कच्चे। फ्रैक्शन से बाहर); } जो मुझे विश्वास दिलाता है कि '।' हमेशा सही विकल्प है और मिलीसेकंड के लिए दशमलव विभाजक के लिए कोई आधिकारिक मानक नहीं है (कम से कम .NET दुनिया में नहीं) ... – Dejan

संबंधित मुद्दे