दशमांश मानों को DateTime.Parse से गलत वापस करने के बजाय DateTime के रूप में पहचाना जाता है


9

मुझे एक स्ट्रिंग मान के आधार पर एक चेक प्रदर्शन करने की आवश्यकता है कि क्या इसकी तारीख या दशमलव लेकिन तारीख पार्स हमेशा दशमलव के लिए सही है।

string val = "3.5";
DateTime oDate = DateTime.Parse(val);

यह एक वैध तारीख देता है 3/5/2019

दिनांक प्रारूप ज्ञात नहीं होने पर इसकी वैध तिथि जानने के लिए स्ट्रिंग को कैसे मान्य किया जाए?


6
पहले दशमलव की जाँच करें? या उपयोग करें DateTime.ParseExactयदि आप जानते हैं कि यह कौन से स्वरूपों को ले सकता है / लेना चाहिए
एक दोस्त का

3
आप TryParseExactमान्य दिनांक स्वरूपों का उपयोग और निर्दिष्ट कर सकते हैं ।
जवाहर

5
वास्तव में - DateTime.Parseकई पैटर्न की कोशिश करता है। यदि आप केवल विशिष्ट लोगों को पहचानना चाहते हैं, तो उन्हें विशेष रूप से पार्स करने का प्रयास करें।
जॉन स्कीट

1
क्या इससे आपके सवाल का जवाब मिलता है? जांचें कि क्या कोई दिनांक DateTime.TryParse
Joost K

जवाबों:


3

"इसकी वैध तिथि जानने के लिए स्ट्रिंग को कैसे मान्य करें?"

मुद्दा यह है कि है "3.5" है कोई मान्य दिनांक (और यह भी एक दशमलव) माना जाता है।

यदि आप चाहते हैं कि दशमलव प्रकार हमेशा "जीत" (यानी आप isDateऔर isDecimalदोनों नहीं चाहते हैं true), तो अपने सत्यापन में एक दशमलव चेक शामिल करें।

ऐसा करने का एक तरीका यह है कि TryParseतरीकों का उपयोग किया जाए (जो कि boolअगर एक स्ट्रिंग टाइप करने के लिए पार्स की जा सकती है, और जो outपरिवर्तित मान के लिए एक पैरामीटर सेट करता है ) तो यह निर्धारित करने के लिए कि क्या स्ट्रिंग को एक प्रकार में परिवर्तित किया जा सकता है, उदाहरण के लिए:

string val = "3.5";

// temp variables to hold parsed values
DateTime tmpDate;
decimal tmpDec;
int tmpInt;

var isDecimal = decimal.TryParse(val, out tmpDec);
var isInteger = int.TryParse(val, out tmpInt);

// When checking if it's a DateTime, make sure it's not also a decimal
var isDate = !isDecimal && DateTime.TryParse(val, out tmpDate);

मैंने पहले ही प्रयास किया था लेकिन 3.5 एक वैध दिनांक और एक वैध दशमलव है, इसलिए यह बिल्कुल भी मदद नहीं करता है।
मुनव्वर

1
उपरोक्त कोड में, यह isDateहै falseक्योंकि इसमें एक चेक शामिल है isDecimal। नहीं है कि आप के लिए क्या पूछ रहे थे?
रुफस एल

2
@ मुनव्वर - "3.5 एक वैध तिथि और एक वैध दशमलव है"। यदि हम, मनुष्य के रूप में, उस तार के साथ प्रस्तुत किए जाते हैं और कोई अन्य संदर्भ नहीं है, तो हम नहीं जानते कि क्या यह एक तिथि, एक दशमलव या कुछ और होने का इरादा था? । आप कंप्यूटर से जादुई रूप से इसका जवाब पाने की उम्मीद नहीं कर सकते।
डेमियन_इन_अनबेलियर १ien

हां, यह उत्तर समस्या के लिए विशिष्ट है, और मेरी समस्या का समाधान करता है, हालांकि यदि प्रारूप ज्ञात हैं तो ParseExact सबसे उपयुक्त होगा।
मुनव्वर

जब दिनांक प्रारूप "12122019" हो तो आपको समस्या होती है
अथानासियोस कतरास

6

ParseExact पर आधिकारिक प्रलेखन की जाँच करें

यदि आपको सटीक प्रतिनिधित्व पता है तो आप कुछ इस तरह से कर सकते हैं:

  format = "ddd dd MMM yyyy h:mm tt zzz";
  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);
  }

यदि आप इसे नहीं जानते हैं, तो आप सांस्कृतिक मेल-मिलाप के साथ फंस गए हैं

एक विशिष्ट संस्कृति के सम्मेलनों का उपयोग करके दिनांक और समय स्ट्रिंग को पार्स करें। पार्स (स्ट्रिंग, IFormatProvider) अधिभार (पार्सिंग और सांस्कृतिक सम्मेलनों को देखें)


प्रारूप ज्ञात नहीं है कि यह उपयोगकर्ता की प्राथमिकताओं के आधार पर हो सकता है।
मुनव्वर

1
@ मौनवर आप उस स्थिति में 1/3/2019 और 3/1/2019 के बीच अंतर कैसे करेंगे?
Blaise

@ एथेंसियोस, एप्लिकेशन का उपयोग अलग-अलग क्षेत्रों और तारीखों के लिए किया जाता है जो एन्क्रिप्टेड स्टोर किए जाते हैं। चूंकि, उपयोगकर्ता दिनांक स्वरूपों को बदल सकता है इसलिए विशिष्ट प्रारूप लागू करने में गड़बड़ी नहीं करना चाहता है, हालांकि प्रारूप ज्ञात होने पर ParseExact सबसे उपयुक्त है।
मुनव्वर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.