DateTime.TryParse yyyy-dd-MM प्रारूप की तारीखों के साथ मुद्दा


84

मेरे पास निम्नलिखित प्रारूप स्ट्रिंग तिथि "2011-29-01 12:00 पूर्वाह्न" है। अब मैं निम्नलिखित कोड के साथ उस डेटाटाइम प्रारूप में बदलने की कोशिश कर रहा हूं:

DateTime.TryParse(dateTime, out dt); 

लेकिन मैं alwayws के रूप में dt हो रहा हूँ {1/1/0001 12:00:00 AM}, क्या आप कृपया मुझे बता सकते हैं क्यों? और मैं उस तार को कैसे बदल सकता हूं।

संपादित करें: मैंने सिर्फ प्रारूप तर्क का उपयोग करने के लिए उल्लेख किया है। मैं अब यह उल्लेख करूंगा कि मैं प्रारूप पैरामीटर का उपयोग नहीं कर सकता क्योंकि मेरे पास कस्टम डेटफ़ॉर्मेट का चयन करने के लिए कुछ सेटिंग है जो उपयोगकर्ता चाहता है, और उसके आधार पर उपयोगकर्ता टेक्स्ट बॉक्स में उस तिथि को jQuery की तारीख के माध्यम से स्वचालित रूप से प्राप्त करने में सक्षम है।


4
वैसे, आप यह निर्धारित कर सकते हैं कि क्या रूपांतरण वापसी मूल्य की जाँच करके विफल हो गया है TryParse। यही कारण है bool success = DateTime.TryParse(...);
जिम मिसल्ट

जवाबों:


188

यह आपके उदाहरण "2011-29-01 12:00 am" के आधार पर काम करना चाहिए

DateTime dt;
DateTime.TryParseExact(dateTime, 
                       "yyyy-dd-MM hh:mm tt", 
                       CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, 
                       out dt);

8
मुझे इससे हराएं। यदि आप अपने इनपुट स्ट्रिंग के प्रारूप को जानते हैं, तो आपको हमेशा TryParseExact / ParseExact विधियों का उपयोग करना चाहिए।
यूरो माइकेल

ठीक है, इसलिए मेरा दिनांक प्रारूप उदाहरण में एक के समान है, लेकिन यदि दिन या महीने का मूल्य एकल अंक है, तो डेटटाइम पार्सर एक त्रुटि को वापस फेंक देगा, क्योंकि इसकी दो अंकों की तलाश तब होती है जब एक ही होता है। इस परिदृश्य में आप क्या सुझाव देंगे?
सियारन गलाघेर

11
मेरे स्वयं के प्रश्न का उत्तर देने के लिए, इस मामले में यदि आप प्रारूप में किसी एक वर्ण का उपयोग करते हैं, तो यह एकल और दोहरे चरित्र दोनों के लिए काम करता है। उदा। d / m / yyyy 13/11/2012 के लिए काम करता है
सियारन गलाघेर

@ ब्रोकनग्लास मेरे लिए काम नहीं कर रहा है क्या आप कृपया मेरी मदद कर सकते हैं
मीना

2
@CiaranGallagher बस एक छोटी सी टिप्पणी, आपकी टिप्पणी की तारीख में बड़े M (d / M / yyyy) का उपयोग करना चाहिए
Yusril Maulidan Raji

14

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

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
try
{
   result = DateTime.ParseExact(dateString, format, provider);
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

यदि उपयोगकर्ता UI में एक प्रारूप निर्दिष्ट कर सकता है, तो आपको उस स्ट्रिंग में अनुवाद करने की आवश्यकता है जिसे आप इस विधि में पारित कर सकते हैं। आप ऐसा कर सकते हैं या तो उपयोगकर्ता को सीधे प्रारूप स्ट्रिंग में प्रवेश करने की अनुमति दें - हालांकि इसका मतलब यह है कि रूपांतरण विफल होने की संभावना है क्योंकि वे एक अमान्य प्रारूप स्ट्रिंग में प्रवेश करेंगे - या एक कॉम्बो बॉक्स होगा जो उन्हें संभावित विकल्पों के साथ प्रस्तुत करता है और आप इन विकल्पों के लिए प्रारूप स्ट्रिंग सेट करें।

यदि यह संभावना है कि इनपुट गलत होगा (उदाहरण के लिए उपयोगकर्ता इनपुट) तो TryParseExactत्रुटि के मामले को संभालने के लिए उपयोग अपवादों के बजाय इसका उपयोग करना बेहतर होगा :

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
DateTime result;
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result))
{
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
else
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

एक बेहतर विकल्प हो सकता है कि उपयोगकर्ता को दिनांक प्रारूपों के विकल्प के साथ प्रस्तुत करें, लेकिन ओवरलोड का उपयोग करें जो स्वरूपों की एक सरणी लेता है :

// A list of possible American date formats - swap M and d for European formats
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                   "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                   "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                   "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                   "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
                   "MM/d/yyyy HH:mm:ss.ffffff" };
string dateString; // The string the date gets read into

try
{
    dateValue = DateTime.ParseExact(dateString, formats, 
                                    new CultureInfo("en-US"), 
                                    DateTimeStyles.None);
    Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
    Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}                                               

यदि आप किसी कॉन्फ़िगरेशन फ़ाइल या डेटाबेस से संभावित प्रारूपों को पढ़ते हैं तो आप इनको जोड़ सकते हैं क्योंकि आप उन सभी अलग-अलग तरीकों से सामना करते हैं जिनसे लोग तारीखें दर्ज करना चाहते हैं।


5

सुरक्षित TryParseExact विधि का उपयोग करके देखें

DateTime temp;
string   date = "2011-29-01 12:00 am";

DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp);

4

Msdn पर दिनांक समय से :

प्रकार: System.DateTime% जब यह विधि वापस आती है, तो रूपांतरण के सफल होने पर दिनांक और समय के समतुल्य DateTime मान सम्‍मिलित होता है, यदि रूपांतरण विफल हुआ, या MinValue यदि रूपांतरण विफल हुआ । रूपांतरण विफल हो जाता है यदि s पैरामीटर शून्य है, एक रिक्त स्ट्रिंग ("") है, या किसी दिनांक और समय का मान्य स्ट्रिंग प्रतिनिधित्व नहीं है। इस पैरामीटर को अनइंस्टाल्यूटिक पास किया गया है।

"yyyy-dd-MM hh:mm tt"इसके बजाय स्वरूप स्ट्रिंग के साथ parseexact का उपयोग करें ।


3

यह काम करता है:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

1
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

0

यदि आप उपयोगकर्ता को दिनांक / समय प्रारूप बदलने का अवसर देते हैं, तो आपको पार्सिंग के लिए उपयोग करने के लिए संबंधित प्रारूप स्ट्रिंग बनाना होगा। यदि आप संभावित तारीख प्रारूप जानते हैं (यानी उपयोगकर्ता को किसी सूची से चयन करना है), तो यह बहुत आसान है क्योंकि आप संकलन समय पर उन प्रारूप को बना सकते हैं।

यदि आप उपयोगकर्ता को दिनांक / समय प्रारूप का फ़्री-फ़ार्मेट डिज़ाइन करने देते हैं, तो आपको DateTimeरनटाइम में संबंधित प्रारूप स्ट्रिंग्स बनाना होगा ।


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