C # में डेट टाइम वेलिडेट कैसे करें?


118

मुझे संदेह है कि मैं एकमात्र ऐसा व्यक्ति हूं जो इस समाधान के साथ आया है, लेकिन अगर आपके पास बेहतर है तो कृपया इसे यहां पोस्ट करें। मैं बस इस प्रश्न को यहां छोड़ना चाहता हूं ताकि मैं और अन्य इसे बाद में खोज सकें।

मुझे यह बताने की जरूरत है कि क्या एक मान्य तारीख एक टेक्स्ट बॉक्स में दर्ज की गई थी और यह वह कोड है जो मैं लेकर आया था। मैं इसे फायर करता हूं जब फोकस टेक्स्ट बॉक्स को छोड़ देता है।

try
{
    DateTime.Parse(startDateTextBox.Text);
}
catch
{
    startDateTextBox.Text = DateTime.Today.ToShortDateString();
}

1
<व्यंग्य> जवाबों को देखते हुए, मुझे लगता है कि मुझे TryParse का उपयोग करना चाहिए </ sarcasm> महान जवाब दोस्तों के लिए धन्यवाद। मैंने TryParse
Matt

2
एक आसान से Google प्रश्न का एक उदाहरण है कि अगर किसी ने पूछा कि आज "पर्याप्त शोध नहीं" करने के लिए गलत तरीके से बंद कर दिया जाएगा।
लाइव-लव

1
बिना किसी विशेष कार्य का उपयोग किए यहां एक आसान तरीका है: < stackoverflow.com/questions/14917203/… >
Zameer

यहां तक ​​कि referenceource.microsoft.com/#mscorlib/system/globalization/…ParseTryParse
Slai

2
DateTimes के साथ काम करना हमेशा बास में दर्द होता है। धन्यवाद
Gonzo345

जवाबों:


269
DateTime.TryParse

मेरा मानना ​​है कि यह तेज़ है और इसका मतलब है कि आपको बदसूरत कोशिश / कैच का उपयोग नहीं करना है :)

जैसे

DateTime temp;
if(DateTime.TryParse(startDateTextBox.Text, out temp))
{
  // Yay :)
}
else
{
  // Aww.. :(
}

2
अगर मैं गलत हूं, तो मुझे सही करें, लेकिन C # (जैसा कि, जावास्क्रिप्ट के विपरीत, विरोध करें) एक if / else शाखा को घुंघराले ब्रेस की आवश्यकता नहीं है? मुझे गलत मत समझो, मैं जांच करने की कोशिश नहीं कर रहा हूं, यह एक शानदार जवाब है और मैं इसे 1 अंक दे रहा हूं, क्योंकि इससे मुझे मदद मिली है, लेकिन आपने अभी सोचा है कि आपको कभी नहीं पता कि भविष्य के नए उपयोगकर्ता पहले से ही पोस्ट किए गए उत्तरों को कैसे देख रहे हैं, यह उन्हें भ्रमित कर सकता है। बेशक, यदि आप C # में घुंघराले ब्रेसिज़ से परेशान हैं, तो यह सवाल आपकी चिंताओं से कम होगा ...
VoidKing

2
@VoidKing आप घुंघराले ब्रेसिज़ के बारे में सही हैं लेकिन अगर आपके पास उस ब्लॉक में केवल 1 स्टेटमेंट है तो आपको उनका उपयोग करने की आवश्यकता नहीं है। यह कुछ अन्य भाषाओं में भी लागू होता है, लेकिन मैं देख सकता हूं कि यह नए कोडर्स को कैसे भ्रमित कर सकता है।
D.Galvez

2
@ D.Galvez मेरे पार्टी में आने के लिए क्षमा करें, लेकिन क्या केवल 1 कथन होने पर भी कोष्ठक को शामिल करना सबसे अच्छा अभ्यास है? यह सिर्फ एक स्थिति है जहाँ निजी प्राथमिकता सबसे महत्वपूर्ण है हो सकता है - और उस मामले में मुझे लगता है सहित उन्हें बस पठनीयता और स्थिरता के लिए काफी अच्छा माना जाता है।
निक

2
थोड़ा मुझे पता था कि 6 साल पहले कोष्ठक के बारे में ऐसी बहस होगी।
क्वि

यह संभव है कि if(DateTime.TryParse(startDateTextBox.Text, out var temp)):) के साथ वैरिएबल इनिशियलाइज़ेशन को छोटा कर दिया जाए
अलेक्जेंड्रे डूबर्टकोर्ट

61

प्रवाह नियंत्रण के लिए अपवादों का उपयोग न करें। DateTime.TryParse और DateTime.TryParseExact का उपयोग करें । व्यक्तिगत रूप से मैं एक विशिष्ट प्रारूप के साथ TryParseExact पसंद करता हूं, लेकिन मुझे लगता है कि ऐसे समय होते हैं जब TryParse बेहतर होता है। अपने मूल कोड के आधार पर उदाहरण का उपयोग करें:

DateTime value;
if (!DateTime.TryParse(startDateTextBox.Text, out value))
{
    startDateTextox.Text = DateTime.Today.ToShortDateString();
}

इस दृष्टिकोण को प्राथमिकता देने के कारण:

  • क्लियर कोड (यह कहता है कि यह क्या करना चाहता है)
  • अपवादों को पकड़ने और निगलने से बेहतर प्रदर्शन
  • यह अपवादों को अनुचित रूप से नहीं पकड़ता है - जैसे कि OutOMemoryException, ThreadInterruptedException। (प्रासंगिक अपवाद को पकड़कर इससे बचने के लिए आपका वर्तमान कोड तय किया जा सकता है, लेकिन TryParse का उपयोग करना अभी भी बेहतर होगा।)

24

यहां समाधान का एक और रूपांतर है जो सच लौटाता है यदि स्ट्रिंग को एक DateTimeप्रकार में परिवर्तित किया जा सकता है , और अन्यथा गलत।

public static bool IsDateTime(string txtDate)
{
    DateTime tempDate;
    return DateTime.TryParse(txtDate, out tempDate);
}

3
StackOverflow में आपका स्वागत है! कृपया उन उत्तरों को देखें जो पहले ही प्रदान किए जा चुके हैं, खासकर जब एक सवाल का जवाब जो तीन साल से अधिक पुराना हो और जिसका सफलतापूर्वक उत्तर दिया गया हो। आपका उत्तर पिछले उत्तरदाताओं द्वारा पहले ही कवर कर दिया गया है।
बॉब कॉफमैन



3

उपयोग करने के साथ एक समस्या DateTime.TryParseयह है कि यह विभाजकों के बिना दर्ज की गई तारीखों के बहुत सामान्य डेटा-एंट्री उपयोग के मामले का समर्थन नहीं करता है, जैसे 011508

इसका समर्थन कैसे करें, इसका एक उदाहरण यहां दिया गया है। (यह एक ऐसे ढांचे से है जिसका मैं निर्माण कर रहा हूं, इसलिए इसका हस्ताक्षर थोड़ा अजीब है, लेकिन मुख्य तर्क प्रयोग करने योग्य होना चाहिए)

    private static readonly Regex ShortDate = new Regex(@"^\d{6}$");
    private static readonly Regex LongDate = new Regex(@"^\d{8}$");

    public object Parse(object value, out string message)
    {
        msg = null;
        string s = value.ToString().Trim();
        if (s.Trim() == "")
        {
            return null;
        }
        else
        {
            if (ShortDate.Match(s).Success)
            {
                s = s.Substring(0, 2) + "/" + s.Substring(2, 2) + "/" + s.Substring(4, 2);
            }
            if (LongDate.Match(s).Success)
            {
                s = s.Substring(0, 2) + "/" + s.Substring(2, 2) + "/" + s.Substring(4, 4);
            }
            DateTime d = DateTime.MinValue;
            if (DateTime.TryParse(s, out d))
            {
                return d;
            }
            else
            {
                message = String.Format("\"{0}\" is not a valid date.", s);
                return null;
            }
        }

    }

मैं अपने मामले में सेपोरेटर्स के बारे में चिंतित नहीं हूं क्योंकि मैं एक नकाबपोश टेक्स्ट बॉक्स का उपयोग कर रहा हूं, लेकिन मैं देख सकता हूं कि इस ऐप के साथ अन्य स्थितियों में मेरा सामना कैसे होगा।
मैट

विभाजकों के बिना डेटाइम स्ट्रिंग का उपयोग करने का क्या कारण है?
सर्गेई कोवलेंको

1
    protected bool ValidateBirthday(String date)
    {
        DateTime Temp;

        if (DateTime.TryParse(date, out Temp) == true &&
      Temp.Hour == 0 &&
      Temp.Minute == 0 &&
      Temp.Second == 0 &&
      Temp.Millisecond == 0 &&
      Temp > DateTime.MinValue)
            return true;
        else
            return false;
    }

// मान लीजिए कि इनपुट स्ट्रिंग शॉर्ट डेट फॉर्मेट है।
उदाहरण के लिए "
2013/7/5" सही या "2013/2/31" रिटर्न गलत है।
http://forums.asp.net/t/1250332.aspx/1
// बूल बूलियनवैल्यू = वैलिडेट बर्थडे ("12:55"); झूठा लौटता है


1
private void btnEnter_Click(object sender, EventArgs e)
{
    maskedTextBox1.Mask = "00/00/0000";
    maskedTextBox1.ValidatingType = typeof(System.DateTime);
    //if (!IsValidDOB(maskedTextBox1.Text)) 
    if (!ValidateBirthday(maskedTextBox1.Text))
        MessageBox.Show(" Not Valid");
    else
        MessageBox.Show("Valid");
}
// check date format dd/mm/yyyy. but not if year < 1 or > 2013.
public static bool IsValidDOB(string dob)
{ 
    DateTime temp;
    if (DateTime.TryParse(dob, out temp))
        return (true);
    else 
        return (false);
}
// checks date format dd/mm/yyyy and year > 1900!.
protected bool ValidateBirthday(String date)
{
    DateTime Temp;
    if (DateTime.TryParse(date, out Temp) == true &&
        Temp.Year > 1900 &&
       // Temp.Hour == 0 && Temp.Minute == 0 &&
        //Temp.Second == 0 && Temp.Millisecond == 0 &&
        Temp > DateTime.MinValue)
        return (true);
    else
        return (false);
}

1

सभी उत्तर बहुत अच्छे हैं, लेकिन यदि आप किसी एकल फ़ंक्शन का उपयोग करना चाहते हैं, तो यह काम कर सकता है।

private bool validateTime(string dateInString)
{
    DateTime temp;
    if (DateTime.TryParse(dateInString, out temp))
    {
       return true;
    }
    return false;
}

1
"If" ब्लॉक के बजाय DateTime.TryParse () के परिणाम वापस करने के बारे में कैसे? इसके अलावा, आपका आईडीई कभी भी इस्तेमाल नहीं किए जाने वाले टेंप पर शिकायत करेगा, जिसे आप फंक्शन कॉल के अंदर सीधे "डेटाइम टेम्प" के रूप में घोषित कर सकते हैं।
सर्गेई कोवलेंको

0

आप DateTimeकिसी विशिष्ट के लिए प्रारूप को भी परिभाषित कर सकते हैंCultureInfo

public static bool IsDateTime(string tempDate)
{
    DateTime fromDateValue;
    var formats = new[] { "MM/dd/yyyy", "dd/MM/yyyy h:mm:ss", "MM/dd/yyyy hh:mm tt", "yyyy'-'MM'-'dd'T'HH':'mm':'ss" };
    return DateTime.TryParseExact(tempDate, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out fromDateValue);
}

-1
protected static bool CheckDate(DateTime date)
{
    if(new DateTime() == date)      
        return false;       
    else        
        return true;        
} 

2
हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोट मिले। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
ब्रायन

सवाल पूछ रहा है कि कैसे मान्य करने के लिए stringएक DateTImeमूल्य हो सकता है या नहीं । आप यह देखने के लिए जाँच कर रहे हैं कि किसी दिए गए DateTimeमें डिफ़ॉल्ट मान (संबंधित 0001-01-01T00:00:00.0000000) है या नहीं। यह प्रश्न का उत्तर कैसे देता है?
dbc

-3
DateTime temp;
try
{
    temp = Convert.ToDateTime(grd.Rows[e.RowIndex].Cells["dateg"].Value);
    grd.Rows[e.RowIndex].Cells["dateg"].Value = temp.ToString("yyyy/MM/dd");
}
catch 
{   
    MessageBox.Show("Sorry The date not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop,MessageBoxDefaultButton.Button1,MessageBoxOptions .RightAlign);
    grd.Rows[e.RowIndex].Cells["dateg"].Value = null;
}

1
U को कैच ट्राई करके वैध की जाँच करनी है। तो यू सभी प्रकार के चर की जाँच के लिए ट्राई कैच का उपयोग कर सकता है और वैध ग्लोबल फ़ंक्शंस बना सकता है और आपकी परियोजना में सभी को नियंत्रित कर सकता है। सबसे अच्छा संबंध ..... अशरफ खलीफा
अशरफ खलीफा

-3
DateTime temp;
try
{
    temp = Convert.ToDateTime(date);
    date = temp.ToString("yyyy/MM/dd");
}
catch 
{
    MessageBox.Show("Sorry The date not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop,MessageBoxDefaultButton.Button1,MessageBoxOptions .RightAlign);
    date = null;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.