
#BugOfTheMonth
Eine kleine Sammlung über das gemeine Ungeziefer,
dass sich hier und da in den Code einschleicht.
Monatsauswahl überspringt einen Monat
ngOnChanges(changes: SimpleChanges): void {
const ctrlValue = this.date.value!;
ctrlValue.setFullYear(this.anyDateOfShownMonth.year(), this.anyDateOfShownMonth.month().ordinal());
this.date.setValue(ctrlValue);
}
public nextMonth(): void {
this.anyDateOfShownMonth = this.anyDateOfShownMonth.plusMonths(1);
this.anyDateOfShownMonthChange.emit(this.anyDateOfShownMonth);
}
Symptom
Sporadisch wird beim Aufruf der Methode nextMonth()
ein Monat übersprungen.
Problem
Ein Blick auf das Datum im Kalendar führte zur Erkenntnis. Es war der 31.. Aber warum führt das zu dem Fehler?
In Zeile 3 wird das Datum initialisiert. Ohne Tag.
Die Methode plusMonths(1)
in Zeile 7 machte dann genau das was sie soll. Das aktuelle Datum um 1 Monat nach hinten schieben.
Ruft man die Methode jetzt natürlich am 31. auf, wird das Datum auf einen 31. eines Monats mit nur 30 Tagen geschoben.
Dieses ungültige Datum wurde nicht mit einem Fehler quittiert, sondern lediglich wiederum auf den 1. des nächsten Monats geschoben, da dieser ja richtigerweise der Tag nach dem 30. des Vormonates ist.
Lösung
Initialisiert man in Zeile 3 das Datum mit einem Tag der in jedem Monat vorkommt (z.B. dem 1.),
ctrlValue.setFullYear(this.anyDateOfShownMonth.year(), this.anyDateOfShownMonth.month().ordinal(), 1);
so ist das verschieben des Datum in den nächsten Monat kein Problem mehr.
Als weiteren Schritt habe ich die Variable this.anyDateOfShownMonth
zu this.firstDateOfShownMonth
umbenannt und den Code entsprechend angepasst.