Wie überprüfe ich eine DateTime in C #?

118

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 suchen können.

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

try
{
    DateTime.Parse(startDateTextBox.Text);
}
catch
{
    startDateTextBox.Text = DateTime.Today.ToShortDateString();
}
Matt
quelle
1
<sarcasm> Nach den Antworten zu urteilen, denke ich, ich sollte TryParse verwenden. </ sarcasm> Danke für die tollen Antworten, Leute. Ich hatte nicht einmal an TryParse gedacht
Matt
2
Ein Beispiel für eine einfach zu googelnde Frage, die, wenn jemand heute gefragt würde, zu Unrecht geschlossen würde, weil er "nicht genug Forschung" hat.
Live-Liebe
1
Hier ist eine einfache Möglichkeit, dies ohne Verwendung spezieller Funktionen zu tun: < stackoverflow.com/questions/14917203/… >
Zameer
2
Die Arbeit mit DateTimes ist immer ein Problem. Danke
Gonzo345

Antworten:

269
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.. :(
}
qui
quelle
2
Korrigieren Sie mich, wenn ich falsch liege, aber in C # (im Gegensatz zu beispielsweise JavaScript) erfordert ein if / else-Zweig keine geschweiften Klammern? Versteh mich nicht falsch, ich versuche nicht zu hinterfragen, es ist eine fantastische Antwort und ich +1, weil es mir geholfen hat, aber ich dachte nur, da du nie weißt, wie neu zukünftige Benutzer sind, wenn du bereits gepostete Antworten ansiehst könnte sie verwirren. Natürlich, wenn Sie Probleme mit geschweiften Klammern in C # haben, wäre diese Frage die geringste Ihrer Sorgen ...
VoidKing
2
@VoidKing Sie haben Recht mit den geschweiften Klammern, aber wenn Sie nur 1 Anweisung in diesem Block haben, müssen Sie sie nicht verwenden. Dies gilt auch in einigen anderen Sprachen, aber ich kann sehen, wie dies für neuere Codierer irreführend sein kann.
D. Galvez
2
@ D.Galvez Entschuldigen Sie mein spätes Kommen zur Party, aber ist es eine bewährte Methode, die Klammern einzuschließen, auch wenn es nur eine Aussage gibt? Dies könnte nur eine Situation, wo persönliche Präferenz ist am wichtigsten - und in diesem Fall finde ich mit ihnen zur besseren Lesbarkeit und Konsistenz ganz schön einfach zu sein.
Nick
2
Vor 6 Jahren wusste ich kaum, dass eine solche Debatte über Klammern stattfinden würde.
Qui
Es ist möglich, die Variableninitialisierung mit if(DateTime.TryParse(startDateTextBox.Text, out var temp)):)
Alexandre Daubricourt
61

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. Beispiel für eine Verwendung basierend auf Ihrem Originalcode:

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

Gründe für die Bevorzugung dieses Ansatzes:

  • 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. B. OutOfMemoryException, ThreadInterruptedException. (Ihr aktueller Code könnte behoben werden, um dies zu vermeiden, indem Sie nur die entsprechende Ausnahme abfangen. Die Verwendung von TryParse wäre jedoch immer noch besser.)
Jon Skeet
quelle
24

Hier ist eine weitere Variante der Lösung, die true zurückgibt, wenn die Zeichenfolge in einen DateTimeTyp konvertiert werden kann, andernfalls false.

public static bool IsDateTime(string txtDate)
{
    DateTime tempDate;
    return DateTime.TryParse(txtDate, out tempDate);
}
Brendan Conrad
quelle
3
Willkommen bei StackOverflow! Bitte schauen Sie sich die Antworten an, die bereits gegeben wurden, insbesondere wenn Sie auf eine Frage antworten, die älter als drei Jahre ist und erfolgreich beantwortet wurde. Ihre Antwort wurde bereits von früheren Befragten beantwortet.
Bob Kaufman
3

Ein Problem bei der Verwendung DateTime.TryParsebesteht darin, dass der sehr häufige Anwendungsfall für die Dateneingabe von Daten, die ohne Trennzeichen eingegeben wurden, nicht unterstützt wird, z 011508.

Hier ist ein Beispiel, wie dies unterstützt werden kann. (Dies ist von einem Framework, das ich erstelle, 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;
            }
        }

    }
Robert Rossney
quelle
Ich mache mir in meinem Fall keine Sorgen um Separatoren, weil ich ein maskiertes Textfeld verwende, aber ich kann sehen, wie nützlich dies in anderen Situationen sein könnte, in denen ich mit dieser App möglicherweise konfrontiert bin.
Matt
Was ist der Grund, eine DateTime-Zeichenfolge ohne Trennzeichen zu verwenden?
Sergei Kovalenko
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;
    }

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

Chung_TheWebDeveloper
quelle
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);
}
Julius
quelle
1

Alle Antworten sind ziemlich gut, aber wenn Sie eine einzelne Funktion verwenden möchten, kann dies funktionieren.

private bool validateTime(string dateInString)
{
    DateTime temp;
    if (DateTime.TryParse(dateInString, out temp))
    {
       return true;
    }
    return false;
}
Sagte Muhammad Idrees
quelle
1
Wie wäre es, wenn Sie das Ergebnis von DateTime.TryParse () anstelle des Blocks "if" zurückgeben? Außerdem würde sich Ihre IDE über nie verwendete Temperatur beschweren, die Sie im Funktionsaufruf direkt als "out DateTime temp" deklarieren könnten.
Sergei Kovalenko
0

Sie können auch das DateTimeFormat für eine bestimmte definierenCultureInfo

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);
}
Yanga
quelle
-1
protected static bool CheckDate(DateTime date)
{
    if(new DateTime() == date)      
        return false;       
    else        
        return true;        
} 
Hasan_H
quelle
2
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
Brian
Die Frage ist, wie stringein DateTImeWert überprüft werden kann, der einen Wert enthält oder nicht . Sie überprüfen, ob eine bestimmte DateTimeStandardwerte hat (entsprechend 0001-01-01T00:00:00.0000000). Wie beantwortet dies die Frage?
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;
}
Ashraf Khalifah
quelle
1
Sie müssen überprüfen, indem Sie versuchen, fangen. Sie können also try catch verwenden, um alle Arten von Variablen zu überprüfen, gültige globale Funktionen zu erstellen und alle in Ihrem Projekt zu steuern. Viele Grüße ..... Ashraf Khalifah
Ashraf Khalifah
-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;
}
Ashraf Khalifah
quelle