Der Titel sagt im Grunde alles. Ich bekomme drei von Benutzern gelieferte Ganzzahlen ( year
, month
, day
) 1 aus einer alten Datenbank (die ich nicht ändern kann). Derzeit verwende ich den folgenden Code, um diese Ganzzahlen in eine DateTime
-Struktur zu analysieren:
Manchmal stellen die Werte kein gültiges Datum dar (ja, Benutzer geben Sachen wie 1999-06-31 ein und nein, die Legacy-App hat dies nicht bestätigt). Seit eine Ausnahme auszulösen, wenn die Datenvalidierung fehlschlägt, gilt dies als schlechte Praxis Ich würde es vorziehen, dies durch Ausnahmecode zu ersetzen. Die einzige Lösung, die ich finden konnte, bestand darin, die ganzen Zahlen in eine Zeichenkette und TryParseExact
diese Zeichenkette umzuwandeln, was mir sogar noch häßlicher vorkommt. Habe ich eine offensichtlich bessere Lösung vermisst?
1 Tatsächlich ist es eine Ganzzahl im Format YYYYMMDD, aber das in Jahr, Monat und Tag umzurechnen ist trivial ...
Es gibt keine statische Funktion IsValidDate()
, so dass Sie es selbst schreiben müssen, die erste naive Implementierung kann sein:
Ich sagte, dass dies eine naive Implementierung ist, da (neben den Argumenten) die einzige Überprüfung, ob ein Datum existiert für das Schaltjahr ist. In der Praxis kann dies aufgrund von Kalenderthemen fehlschlagen, wenn Sie mit nicht-gregorianischen Kalendern arbeiten (und fehlende Tage sogar im Gregorianischen Kalender, der zum Ausrichten des Datums aus dem Julianischen Kalender verwendet wurde).
Diese Annahmen können für nicht-Gregorianische Kalender gebrochen werden:
DateTime
technical limit, aber es kann einen Kalender (oder ein Era innerhalb eines Kalenders) mit einem anderen Minimum (und Maximum) geben. Regeln, um dies zu verwalten, sind ziemlich komplex und es ist zu einfach, etwas zu vergessen. In diesem Fall ist das Abfangen einer Ausnahme möglicherweise keine so schlechte Idee. Eine bessere Version der vorherigen Validierungsfunktion kann einfach eine grundlegende Validierung bereitstellen und auf DateTime
zurückgreifen, um andere Regeln zu überprüfen:
Wenn Sie diese neue Funktion verwenden, sollte Ihr ursprünglicher Code lauten:
%Vor% Sie können DateTime.DaysInMonth
verwenden, um zu prüfen, ob das Datum gültig ist. Offensichtlich muss der Monat in Reichweite sein (1; 12)
Tags und Links .net c# datetime validation