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