Rolf b: js: Datum - Tage addieren - in Serie

Beitrag lesen

Man KANN Datumsrechnungen in der DB machen, wenn das Rechenergebnis denn Teil des Query-Ergebnisses ist. Aber der OP sagt doch, dass die Berechnung von der Reihenfolge seiner Zeilen abhängt, und die ist im Client veränderbar. Wegen einer Datumsarithmetik extra einen SQL Request zu machen - klar, geht, würde funktionieren, aber das ist dann der besagte Winkelschleifer. Aber das hast Du auch bestimmt nicht gemeint.

Das Wiki empfiehlt eine riskante Methode, Datumsrechnungen auf einem time_t-artigen Wert durchzuführen. Tagesaddition geht damit so:

function addDays(inputDate, numDays) {
   return new Date(inputDate.getTime() + numDays*24*60*60*1000);
}

Nur scheitert dieser Algorithmus an diesem einen Fünfundzwanzigstundentag, wo von Sommerzeit auf Winterzeit umgestellt wird. Das war dieses Jahr der 30.10., man gebe einmal in die Browser-Console

new Date( new Date(2016,9,30).getTime() + 24*3600000 )

ein (die Monate beginnen im Date-Kontruktor mit 0). Gut, wenn's nur um das Datum geht, könnte man zum Addieren von n Tagen einfach $$(n \cdot 24+1)\cdot 3600000$$ Millisekunden dazurechnen und den eventuellen Überschuss von einer Stunde ignorieren.

Ich finde aber, dass es so besser ist:

function addDays(inputDate, numDays) {
   return new Date(inputDate.getYear(), inputDate.getMonth(), inputDate.getDay() + numDays);
}

Man macht sich dabei zu Nutze, dass der Date-Kontruktor Grenzverletzungen bei den Eingabewerten klaglos akzeptiert. Der 32. Dezember ist der 1. Januar. Der -4. Dezember ist der 26. November. Und der 30. Februar ist der 1. oder 2. März, je nachdem, ob ein Schaltjahr ist oder nicht.

Wenn man die Zeit im Date-Objekt behalten will, müsste man den um die Zeitwerte erweiterten Konstruktor verwenden.

Rolf