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();
}
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.. :(
}
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:
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);
}
Ich würde die DateTime.TryParse () -Methode verwenden: http://msdn.Microsoft.com/en-us/library/system.datetime.tryparse.aspx
Was ist mit TryParse ?
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;
}
}
}
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;
}
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);
}
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);
}