it-swarm.com.de

Wie validiere ich eine DateTime in C #?

Ich bezweifle, dass ich der einzige bin, der diese Lösung gefunden hat, aber wenn Sie eine bessere haben, posten Sie sie bitte hier. Ich möchte diese Frage einfach hier lassen, damit ich und andere sie später durchsuchen können.

Ich musste feststellen, ob in ein Textfeld ein gültiges Datum eingegeben wurde und dies ist der Code, den ich mir ausgedacht habe. Ich feuere dies ab, wenn der Fokus das Textfeld verlässt.

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

Dies ist meiner Meinung nach schneller und bedeutet, dass Sie keine hässlichen Versuche/Fänge verwenden müssen :)

z.B

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

Verwenden Sie keine Ausnahmen für die Flusskontrolle. Verwenden Sie DateTime.TryParse und DateTime.TryParseExact . Persönlich bevorzuge ich TryParseExact mit einem bestimmten Format, aber ich denke, es gibt Zeiten, in denen TryParse besser ist. Beispielanwendung basierend auf Ihrem Originalcode:

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

Gründe, diesen Ansatz zu bevorzugen:

  • Klarerer Code (er sagt, was er tun möchte)
  • Bessere Leistung als Ausnahmen zu fangen und zu schlucken
  • Dies fängt Ausnahmen nicht unangemessen ab - z. OutOfMemoryException, ThreadInterruptedException. (Ihr aktueller Code könnte korrigiert werden, um dies zu vermeiden, indem Sie nur die entsprechende Ausnahme abfangen. Die Verwendung von TryParse wäre jedoch immer noch besser.)
58
Jon Skeet

Hier ist eine andere Variante der Lösung, die true zurückgibt, wenn der String in einen DateTime -Typ konvertiert werden kann, andernfalls false.

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

Ich würde die DateTime.TryParse () -Methode verwenden: http://msdn.Microsoft.com/en-us/library/system.datetime.tryparse.aspx

4
Alex Fort

Was ist mit TryParse ?

3
shapr

Ein Problem mit der Verwendung von DateTime.TryParse ist, dass es den sehr häufigen Dateneingabeverwendungsfall von Daten, die ohne Trennzeichen eingegeben wurden, nicht unterstützt, z. 011508.

Hier ist ein Beispiel, wie dies unterstützt werden kann. (Dies ist aus einem Framework, das ich baue, daher ist seine Signatur etwas seltsam, aber die Kernlogik sollte verwendbar sein.):

    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;
            }
        }

    }
3
Robert Rossney

Alle Antworten sind ganz toll, aber wenn Sie eine einzelne Funktion verwenden möchten, funktioniert dies möglicherweise.

private bool validateTime(string dateInString)
{
    DateTime temp;
    if (DateTime.TryParse(dateInString, out temp))
    {
       return true;
    }
    return false;
}
1
Sayed idrees
    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;
    }

// Angenommen, die Eingabezeichenfolge hat ein kurzes Datumsformat.
z.B. "2013/7/5" gibt true oder zurück
"2013/2/31" gibt false zurück.
http://forums.asp.net/t/1250332.aspx/1
// bool booleanValue = ValidateBirthday ("12:55"); gibt false zurück

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
Julius

Sie können auch das Format DateTime für ein bestimmtes CultureInfo definieren.

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);
}
0
Yanga