Gesucht: DateTime.TryNew (Jahr, Monat, Tag) oder DateTime.IsValidDate (Jahr, Monat, Tag)

7

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:

%Vor%

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 ...

    
Heinzi 27.02.2012, 15:53
quelle

2 Antworten

16

Es gibt keine statische Funktion IsValidDate() , so dass Sie es selbst schreiben müssen, die erste naive Implementierung kann sein:

%Vor%

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).

Arbeiten mit Kalendern

Diese Annahmen können für nicht-Gregorianische Kalender gebrochen werden:

  • 1. Januar 01 ist das kleinste gültige Datum. Es ist nicht wahr. Verschiedene Kalender haben ein anderes Datum. Dieses Limit ist nur DateTime technical limit, aber es kann einen Kalender (oder ein Era innerhalb eines Kalenders) mit einem anderen Minimum (und Maximum) geben.
  • Die Anzahl der Monate in einem Jahr ist kleiner oder gleich 12. Es ist nicht wahr, in manchen Kalendern ist die Obergrenze 13 und es ist nicht immer für jedes Jahr gleich.
  • Wenn ein Datum gültig ist (nach allen anderen Regeln), dann ist es ein gültiges Datum. Es ist nicht wahr, ein Kalender kann mehr als eine Ära haben und nicht alle Daten sind gültig (möglicherweise sogar innerhalb des Datumsbereiches).

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:

%Vor%

Wenn Sie diese neue Funktion verwenden, sollte Ihr ursprünglicher Code lauten:

%Vor%     
Adriano Repetti 27.02.2012, 15:57
quelle
9

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)

    
Piotr Auguscik 27.02.2012 15:56
quelle

Tags und Links