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();
}
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.. :(
}
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:
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);
}
J'utiliserais la méthode DateTime.TryParse (): http://msdn.Microsoft.com/en-us/library/system.datetime.tryparse.aspx
Qu'en est-il de l'utilisation de TryParse ?
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;
}
}
}
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;
}
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
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);
}
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);
}