Wir bitten um Entschuldigung, wenn das schon einmal gefragt wurde. Ich habe einige Daten, die ich als Strings speichern muss, einige davon sind Daten. Die Daten beginnen als Zeichenfolgen wie "01/02/10" (britisches Format). Jetzt, später, werden diese Daten geparst und, abhängig davon, was das Parsing ist, sind die Ergebnisse unterschiedlich (zum Beispiel 01-Feb-10 vs. 02-Jan-10). Da die Daten als Strings beginnen, möchte ich vor der Speicherung sagen: "Wenn das wie ein Datum aussieht, formatiere es als dd-mmm-yy".Schreiben einer IsDate() Entsprechung in C#?
Das Problem ist, dass viele Dinge wie ein Datum für die Funktion DateTime.Parse() aussehen.
Also habe ich einige Regeln angewendet und akzeptiere nur "vernünftige" Datumsformate für meine Prüfungen und schrieb eine IsDate() - Funktion. Ich suche Vorschläge, wie dies zu tun ist, denn während es funktioniert, scheint meine Lösung sehr klobig zu sein.
Der ganze Grund, warum ich dies getan habe, anstatt die übliche DateTime.TryParse-Routine zu durchlaufen, ist klar, wenn Sie jemals angefangen haben, zufällige Zeichenfolgen darauf zu werfen (wie "3/4" und "6.12").
Hier ist, was ich bisher:
class Program
{
static void Main(string[] args)
{
Debug.Assert(IsDate(6.12) == false);
Debug.Assert(IsDate("3/4") == false);
Debug.Assert(IsDate(010210) == false);
Debug.Assert(IsDate("010210") == false);
Debug.Assert(IsDate("12-jan-2000") == true);
Debug.Assert(IsDate("12-12-20") == true);
Debug.Assert(IsDate("1/1/34") == true);
Debug.Assert(IsDate("09/30/20") == false);
Debug.Assert(IsDate(DateTime.Now) == true);
}
static Boolean IsDate(Object value)
{
DateTimeFormatInfo DateTimeFormatGB = new CultureInfo("en-GB").DateTimeFormat; // new CultureInfo("en-US").DateTimeFormat;
return IsDate(value, DateTimeFormatGB);
}
static private List<String> AcceptableDateFormats = new List<String>(72);
static Boolean IsDate(Object value, DateTimeFormatInfo formatInfo)
{
if (AcceptableDateFormats.Count == 0)
{
foreach (var dateFormat in new[] { "d", "dd" })
{
foreach (var monthFormat in new[] { "M", "MM", "MMM" })
{
foreach (var yearFormat in new[] { "yy", "yyyy" })
{
foreach (var separator in new[] { "-", "/" }) // formatInfo.DateSeparator ?
{
String shortDateFormat;
shortDateFormat = dateFormat + separator + monthFormat + separator + yearFormat;
AcceptableDateFormats.Add(shortDateFormat);
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm"); // formatInfo.TimeSeparator
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm:ss");
}
}
}
}
}
String sValue = value.ToString().Trim();
DateTime unused;
foreach (String format in AcceptableDateFormats)
{
if (DateTime.TryParseExact(sValue, format, formatInfo, DateTimeStyles.None, out unused) == true) return true;
}
return false;
}
}
Ich benutze nicht die Datum/Zeit-Separatoren aus der Kultur Information, weil ich sowohl ein „/“ akzeptieren wollte und ein „-“. Ich denke, ich hätte die Zeit auch nutzen können, da sich das (für mich) wahrscheinlich nicht ändern wird.
Warum nicht DateTime.TryParse verwenden und dann eine Plausibilitätsprüfung durchführen, zum Beispiel für den Jahresteil der zurückgegebenen DateTime? –