2008-10-02 9 views
23

मैं ब्राउज़िंग स्कॉट Hanselman Developer Interview question list था, और इस सवाल के पार भाग गया:डेटटाइम के साथ क्या गलत है। पर्स (myString)?

क्या DateTime.Parse (myString) के साथ गलत क्या है?

जबकि मुझे पता है कि अनजान प्रारूप या मूल की एक स्ट्रिंग को पार्स करने में अंतर्निहित जोखिम हैं, तो क्या अन्य कारण हैं? क्या यह डेटटाइम का उपयोग करना है। इसके बजाय पैरासेक्स? क्या यह myString.ToString() पहले होना चाहिए?

+0

तो रुचि किसी को भी, मैंने लिखा के रूप में तुर्की में उस सवाल के बारे में एक लेख [DateTime.Parse (स्ट्रिंग) kullanmayı bırakamaz mıyız?] (http://sonergonul.net/datetime-parse-string-kullanmayi-birakamaz-miyiz/)। –

उत्तर

26

इसके अलावा वातावरण समस्या, DateTime.Parse() भी एक अपवाद है जिसे आप को पकड़ने के लिए होता है फेंक सकता है। इसके बजाय DateTime.TryParse() या DateTime.TryParseExact() का उपयोग करें।

+7

TryParse/TryParseExact के लिए महान हैं जब डेटा अविश्वसनीय स्रोत से आया है। यदि आपके पास यह मानने का अच्छा कारण है कि अमान्य डेटा एक महत्वपूर्ण सिस्टम त्रुटि का प्रतिनिधित्व करता है, हालांकि, अपवाद फेंकना सही बात है। सार्वभौमिक रूप से पर्स को ट्राईपर्स में बदलने का अच्छा विचार नहीं है। –

+0

वाह जोएल, आप जल्दी और अल के रूप में सही कर रहे हैं तरीके! –

+1

अच्छा, ज्यादातर सटीक - जॉन स्कीट एक अच्छा मुद्दा बनाता है। मैं अपनी प्रतिक्रिया से खड़ा हूं हालांकि: मुझे लगता है कि बहुत सारे मामले हैं जहां आप TryParse() व्यवहार चाहते हैं। –

0

इस ब्लॉग पोस्ट explains it, लेकिन सामान्य बात नहीं पार्स के साथ जुड़े नहीं CultureInfo है कि है।

14

एक बुरा विचार सिस्टम पर वर्तमान धागा संस्कृति का प्रयोग किया जाता है अक्सर, जैसा है "को विभिन्न प्रारूपों की कोशिश, और देखते हैं कि उनमें से कोई काम करते हैं।" एक विशिष्ट संस्कृति के साथ

ParseExact एक और अधिक नियंत्रित और सटीक तरीका है। (यहां तक ​​कि अगर आप वर्तमान संस्कृति निर्दिष्ट करने पर, यह और भी स्पष्ट पाठकों के लिए है कि क्या हो रहा है यह है कि बनाता है।)

5

MSDN का कहना है:

क्योंकि पार्स (स्ट्रिंग) विधि की कोशिश करता है पार्स करने के लिए की स्ट्रिंग प्रस्तुति वर्तमान संस्कृति के नियमों का उपयोग करके दिनांक और समय पर किसी विशेष स्ट्रिंग को पार्स करने के लिए विभिन्न संस्कृतियों को असफल कर सकती है या तो अलग-अलग परिणाम लौटा सकती है। एक विशिष्ट दिनांक और समय प्रारूप विभिन्न स्थानों भर में पार्स हो जाएगा, का उपयोग DateTime.Parse (स्ट्रिंग, IFormatProvider) विधि या ParseExact विधि के भार के में से एक और एक फॉर्मेट स्पेसिफायर प्रदान करते हैं।

1

अज्ञात उपयोगकर्ता इनपुट के अलावा पर्यावरण अज्ञात हो सकता है .., इसलिए मुझे लगता है कि कि भले ही आप इनपुट प्रारूप, क्या पार्स उम्मीद अलग हो सकता है .. पर नियंत्रण

3

यही सवाल सिर्फ करने के लिए है देखें कि डेवलपर इसके साथ मुद्दों को जानता है या नहीं। सबसे पहले आपको TryParse का उपयोग करना चाहिए क्योंकि यदि यह अदृश्य है तो पार्स अपवाद फेंकता है। इसके अलावा यह स्थानीय परिदृश्य में नहीं लेता है, इसलिए एक वेब परिदृश्य में, यदि कोई ब्रिटिश उपयोगकर्ता 02/10/2008 टाइप करता है, और मेरा सर्वर एक यूएस-यूएस लोकेल का उपयोग कर रहा है, तो मुझे 2 अक्टूबर, 2008 की बजाय 10 फरवरी 2008 को मिलता है।

अन्य मुद्दों हो सकती है, लेकिन उन पहले दो जो मन में उभर रहे हैं।

1

मेरे पेट प्रतिक्रिया है कि आप इसे अज्ञात प्रारूपों/मूल से मारा जा रहा है। अन्य कारण भी हो सकते हैं - उदाहरण के लिए, उस एकल रेखा से, क्या हम जानते हैं कि myString एक स्ट्रिंग है? (मुझे लगता है कि यह निश्चित रूप से है।)

आम तौर पर मैं इसके बजाय TryParse विधि की अनुशंसा करता हूं। यह थोड़ा और वर्बोज़ है, लेकिन अपवादों को रोकने में मदद करता है - जब तक आपका कोड अमान्य इनपुट के मामले में उचित तरीके से व्यवहार करता है।

बेशक

, इस के लिए अपने शब्दों के आधार पर ... मुझे लगता है आप पहले से ही यह सब पता था। :)

0

जवाब कोड जो DateTime.Parse (myString) और पार्स

आप पहले से ही जाँच स्ट्रिंग मान्य एक regex के आधार पर प्रारूप है हो सकता है की आवश्यकताओं को चारों ओर से घेरे पर निर्भर करता है और आप नहीं हो सकता है संस्कृति की जानकारी में दिलचस्प है। आप यह भी जान सकते हैं कि डेटा ज्ञात फ़ाइल प्रारूप से आता है, ज्ञात दिनांक सम्मेलन के साथ, इसलिए अपवाद फेंकना वांछित हो सकता है।

संदर्भ के बिना सवाल काफी अस्पष्ट है और इसे करने के लिए असली जवाब है "होने के लिए यह, संदर्भ में, जहां कोड क्या यह गलत है के रूप में प्रयोग किया जाता है पर निर्भर करता है अगर एक

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