web-dev-qa-db-fra.com

Comment valider un DateTime en C #?

Je doute que je sois le seul à avoir proposé cette solution, mais si vous en avez une meilleure, merci de la poster ici. Je veux simplement laisser cette question ici pour que moi et les autres puissent la chercher plus tard.

J'avais besoin de dire si une date valide avait été entrée dans une zone de texte et c'est le code que j'ai créé. Je déclenche ceci lorsque le focus quitte la zone de texte.

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

Ceci, je crois, est plus rapide et cela signifie que vous n’avez pas à utiliser de mauvais essais/captures :)

par exemple

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

N'utilisez pas d'exceptions pour le contrôle de flux. Utilisez DateTime.TryParse et DateTime.TryParseExact . Personnellement, je préfère TryParseExact avec un format spécifique, mais j'imagine que TryParse est parfois préférable. Exemple d'utilisation basé sur votre code d'origine:

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

Raisons pour préférer cette approche:

  • Code plus clair (il dit ce qu'il veut faire)
  • Meilleure performance que les exceptions de capture et d'ingestion
  • Cela n'intercepte pas les exceptions de manière inappropriée - par exemple. OutOfMemoryException, ThreadInterruptedException. (Votre code actuel pourrait être corrigé pour éviter cela en capturant simplement l'exception pertinente, mais l'utilisation de TryParse serait tout de même meilleure.)
58
Jon Skeet

Voici une autre variante de la solution qui renvoie true si la chaîne peut être convertie en un type DateTime, et false sinon.

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

J'utiliserais la méthode DateTime.TryParse (): http://msdn.Microsoft.com/en-us/library/system.datetime.tryparse.aspx

4
Alex Fort

Qu'en est-il de l'utilisation de TryParse ?

3
shapr

L’utilisation de DateTime.TryParse pose un problème, car elle ne prend pas en charge le cas très courant d’utilisation de la saisie de données, à savoir les dates saisies sans séparateurs, par exemple. 011508.

Voici un exemple de la façon de supporter ceci. (Ceci est issu d'un framework que je construis, sa signature est donc un peu bizarre, mais la logique de base devrait être utilisable):

    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

Toutes les réponses sont très bonnes, mais si vous souhaitez utiliser une seule fonction, cela peut fonctionner.

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

// supposons que la chaîne d'entrée est un format de date court.
par exemple. "2013/7/5" renvoie vrai ou
"2013/2/31" renvoie false.
http://forums.asp.net/t/1250332.aspx/1
// bool booleanValue = ValidateBirthday ("12:55"); retourne faux

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
Julius

Vous pouvez également définir le format DateTime pour un CultureInfo spécifique

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