Ich habe eine Methode, die (manchmal) eine Zeichenfolge im Format "dddd MMMM dd"
(Montag Januar 04), die in eine DateTime analysiert werden muss. Ich sage manchmal, weil es auch in "Today"
oder "Tomorrow"
als Wert übergeben werden kann.Verwenden von DateTime.TryParseExact ohne das Jahr zu kennen
Der Code zu handhaben war einfach genug:
if (string.Compare(date, "Today", true) == 0)
_selectedDate = DateTime.Today;
else if (string.Compare(date, "Tomorrow", true) == 0)
_selectedDate = DateTime.Today.AddDays(1);
else
_selectedDate = DateTime.Parse(date);
Das funktionierte bis zur Hälfte bis Dezember. Einige von Ihnen haben wahrscheinlich schon gesehen, was schief gelaufen ist.
Dies wäre an einem Tag im neuen Jahr mit dem Fehler fehlgeschlagen:
"String was not recognized as a valid DateTime because the day of week was incorrect."
Es wurde "Monday January 04"
geführt zu werden, die für das Jahr 2010 ein gültiges Datum ist, aber nicht im Jahr 2009.
Also meine Frage ist: Gibt es eine Möglichkeit, das Jahr entweder für das laufende Jahr oder das nächste Jahr festzulegen? Gerade jetzt, als quick and dirty fix, ich habe dies:
if (!DateTime.TryParseExact(date, "dddd MMMM dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out _selectedDate))
if (!DateTime.TryParseExact(date + " " + (DateTime.Now.Year + 1), "dddd MMMM dd yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out _selectedDate))
throw new FormatException("That date is not valid.");
So wird es versuchen, analysieren sie das aktuelle Jahr verwendet wird, und wenn es nicht erfolgreich ist, wird es erneut versuchen, das im nächsten Jahr verwenden. Wenn es danach fehlschlägt, wird es einfach ein ungültiges Datum sein, weil ich mich nur ungefähr 1 Jahr im Voraus sorgen muss, aber wenn jemand eine flexiblere Lösung hat, würde ich es begrüßen. (Beachten Sie, dass ich mich nicht darum kümmern muss, das Datum zu bestätigen, das übergeben wird, es wird entweder für das aktuelle oder das folgende Jahr gültig sein).
+1000 auf den ersten Absatz. Dies ist ein perfektes Beispiel dafür, wo Unit-Tests das Problem viel früher im Entwicklungszyklus behoben hätten. –
Danke für die ausgezeichnete Antwort. Es gibt Unit-Tests, ich habe dieses Szenario nie in Betracht gezogen :(Es gibt keinen Grund, warum ich eine Methode zum Vergleichen von Strings mit einer anderen verwende. Ich war mir nicht sicher, ob es wichtig war oder nicht. Außerdem muss ich mir keine Sorgen machen Vorige Jahre wie das Auswählen eines Datums in der Vergangenheit ist nicht erlaubt Nochmals vielen Dank – Brandon
Ich brauchte Klammern um (DateTime.Now.Year + 1) sonst endete ich mit einer 1 am Ende meines Jahres, zB 20181 –