Wie berechnet man den Ultimo (Monatsende) eines bestimmten Monats in einem bestimmten Jahr in (fast) allen Programmiersprachen?
Vorausetzung: Datumsfunktion und Tagesfunktion muss vorhanden sein.
Jahr = 2024
Monat = 2
Erster = Datum(Jahr,Monat,Tag)
DatumFolgeMonat = Erster + 35 # kommt auf jeden Fall ins nächste
# Monat aber nicht ins übernächste Monat
Ultimo = DatumFolgeMonat - Tag(DatumFolgeMonat)
Erster = Datum(2024,2,1)
DatumFolgeMonat = 1.2.2024 + 35 = 7.3.2024 # 35 Tage dazuaddieren
Ultimo = 7.3.2024 - 7 = 29.2.2024
Bei manchen Programmiersprachen ist die Funktion Monatsende bereits programmiert.
Erster = Datum(2022,2,1)
DatumFolgeMonat = 1.2.2022 + 35 = 8.3.2022
Ultimo = 8.3.2022 - 8 = 28.3.2022
Erster = Datum(2022,12,1)
DatumFolgeMonat = 1.12.2022 + 35 = 5.1.2023
Ultimo = 5.1.2023 - 5 = 31.12.2022
Statt Ultimo = 8.3.2022 - 8 = 28.2.2022
und nicht 28.3.2022
2 Antworten
Die meisten Programmiersprachen haben eine entsprechende API im Repertoire, mit der man Datumsberechnungen durchführen kann. Du brauchst an sich nur einen Tag vom ersten Tag des Folgemonats subtrahieren.
Beispiel in JavaScript:
const lastDayOfJanuary = new Date(2021, 1, 0);
Die Monatszählung beginnt hier bei 0. Da für den Tag eine 0 angegeben wird (statt der 1 für den ersten Tag), rechnet JavaScript automatisch herunter.
Aber ja, es macht auch Sinn, im Vorfeld noch tiefer in die Dokumentation zu blicken. Sei es C#, Java, PHP, Python, ... sehr häufig gibt es bereits eine Funktion, die selbst diese obige Rechnung überflüssig macht.
Wenn man unbedingt eine eigene mathematische Lösung finden möchte, würde ich zunächst den Monat (numerisch) prüfen. Auf der Grundlage, dass die Monatsangabe bei 0 beginnt, hättest du bei den Monaten 0, 2, 4, 6, 7, 9 und 11 jeweils 31 Tage. Bei den Monaten 3, 5, 8 und 10 wiederum 30. Somit bleibt nur noch der Februar, für den man (mit Hilfe der Jahresangabe) schauen müsste, ob es sich um ein Schaltjahr handelt oder nicht. Die Kriterien dafür werden auf dieser Seite zusammengefasst. Die Berechnung könnte also folgendermaßen aussehen:
int days = 28;
if ((year % 4 == 0 && year % 100 == 0 && year % 400 == 0)
|| (year % 4 == 0 && year % 100 != 0)) {
days = 29;
}
Mit der von dir beschriebenen Funktion hast du immer eine Abfrage, ob du vom Monat 12 den Ultimo wissen willst und dann im Folgejahr den 1.1. setzen. Dann kannst du erst den 1 Tage abziehen...