Datum arithmetische Berechnungen
    
 HomeDatum • arithmetische Berechnungen Quellcode 

 Datumsobjekt arithmetische Berechnungen

Wenn Sie von einem Datumswert einen anderen Datumswert subtrahieren wollen oder wenn Sie zu einem Datumswert einen festen Wert addieren / subtrahieren wollen handelt es sich dabei um eine arithmetische Berechnung mit Datumswerten.

Rechnen mit Datumswerten - das Date-Objekt

ein- / ausblenden kurz und bündig: Subtraktion von Datumswerten


Wenn Sie das Prinzip und die Regeln verstanden haben, ist das eigentlich nichts anderes jede andere Kalkulation. Später kommt noch der Vergleich mit einer Konstanten oder einem anderen Datumswert hinzu. Das hört sich nach viel Mathematik an, ist aber halb so wild.

In JavaScript wird allerdings nicht mit Tagen sondern gundsätzlich mit Millisekundenwerten gerechnet! Wie man das für eine brauchbare Berechnung umsetzt, lesen Sie hier.



   Demo 01

Die programminterne Berechnung von Datumswerten bezieht sich in JavaScript immer auf das Startdatum 01.01.1970! Daher nehme ich auch genau dieses Datum zur Veranschaulichung.

Zeitspanne zwischen dem 01.07.2010 und dem 22.07.2010 berechnen:

Kennt man die Zeitspanne zwischen den beiden Daten 01.01.1970 | 01.07.2010 und die Zeitspanne zwischen den beiden Daten 01.01.1970 | 22.07.2010, kann man mit der Differenz auch die 'Zwischenzeit' ermitteln.


// Wert in Millisekunden
var Differenz = ZeitVerstrichen1 – ZeitVerstrichen2
Die Berechnungen beziehen sich also auf das 'Urdatum' 01.01.1970. Damit schließe ich alle Fehlberechnungen Probleme oder zusätzlichen Prüfungen aus, die sich durch Konstruktionen eigener Berechnungsformeln ergeben könnten. Schließlich wird von JavaScript das Vorkommen von Schaltjahren berücksichtigt.



   Demo 02

Ich möchte zur Berechnung einer Zeitspanne oder für einen Vergleich einen Datumswert von einem andern Datumswert subtrahieren oder hinzu zählen.

Die Variablen DatumZukunft, DatumHeute, DatumVergangenheit, ... usw. werden vor den Berechnungen mit den entsprechenden Werten 'befüllt'. Hier möchte ich lediglich die Berechnungszeile darstellen.

Zeitspanne zwischen 'jetzt' und dem 31.12.2030 berechnen:
var ZeitBis = DatumZukunft – DatumHeute  // Ergebnis ist ein Wert in Millisekunden
Zeitspanne zwischen 'jetzt' und dem 01.12.1999 berechnen:
var ZeitSeit = DatumHeute – DatumVergangenheit  // Ergebnis ist ein Wert in Millisekunden
Wie viele Tage sind es bis zum 31.12.2030 wenn ein Tag 86400000 Millisekunden hat?
var AnzahlTage = (DatumZukunft – DatumHeute) /  86400000;


   Demo 03

Die Variablen DatumWeihnachten, DatumHeute, Datum01, ... usw. werden vor den Berechnungen mit den entsprechenden Werten 'befüllt'. Hier möchte ich lediglich die Berechnungszeile darstellen.

24 Stunden entsprechen 86400000 Millisekunden
1 Woche entspricht 604800000 Millisekunden
1 Minute entspricht 60000 Millisekunden

Berechnungen mit Datumswerten (Syntax)
var Differenz = Datum01 – Datum02;
var DatumIn30Tagen = DatumHeute + (30 * 86400000);
var TageBisWeihnachten = (DatumWeihnachten - DatumHeute) /  86400000;
var WochenBisWeihnachten = (DatumWeihnachten - DatumHeute) /  (86400000 * 7);
var WochenBisWeihnachten = (DatumWeihnachten - DatumHeute) /  604800000;
var MinutenBisWeihnachten = (DatumWeihnachten - DatumHeute) /  60000;
var SekundenBisWeihnachten = (DatumWeihnachten - DatumHeute) /  1000;
Bei der Berechnung von Monaten wird es dann ein wenig komplexer. Das lesen Sie auf einer separaten Seite.



   Demo 04

Mit JavaScript lassen sich beinahe alle erdenklichen datums- und zeitbezogenen Berechnungen anstellen. Vollmond, Feiertage, Bevölkerungswachstum, ... . Sie müssen nur die richtige Formel oder Konstante kennen und natürlich die entsprechenden JavaScript-Funktionenen und Regeln.

Konstante für 1 Mondperiode = 29.53059027 Tage

  Beispiel einer Berechnung:  





   Mit Datumswerten rechnen - Ergebnisse runden, umwandeln, vergleichen


1  zwei Date-Objekte herstellen

Für meine Berechnungen schaffe ich zwei neue Datums-Objekte. Eines soll das aktulle Datum enthalten (Kopie der Systemzeit). Das zweite soll den Datumswert für den 24.12.2020 enthalten. Dazu legt man gleich beim "Kreieren" des neuen Date-Objekts die Werte für Jahr, Monat und Tag fest.

Stunden, Minuten, Sekunden und Millisekunden könnte man ebenfalls eintragen. Fehlen diese Angaben wird der Wert jeweils mit '0' festgelegt. Berücksichtigen Sie beim Eintrag des Monatswertes, das JavaScript beim Hochzählen der Monate mit Null beginnt (Januar = 0, Dezember = 11).
var Variablenname = new Date(Jahr,Monat,Tag);
var DatumHeute = new Date();
var DatumVergleich = new Date(2020,11,24);
Mit den beiden Codezeilen oben habe ich zwei neue Date-Objekte geschaffen.

ein- / ausblenden: Werte von DatumHeute + DatumVergleich



2  zwei Date-Objekte subtrahieren

Nun bin ich im Besitz von zwei Objekten die Datumsinformationen enthalten (die beiden Date-Objekte sind ja von mir geschaffen). Wenn ich den einen Wert von dem anderen subtrahiere, erhalte ich die Differenz. Damit meine Berechnungen in JavaScript auch stimmen bin ich mir im Klaren darüber, dass die Ergebnisse Millisekundenwerte darstellen.
var Differenz01 = DatumVergleich - DatumHeute    [in Millisekunden]
Die 'Umwandlung' in Millisekunden (besser die 'Entnahme' des Millisekundenwertes) aus einem Date-Objekt ist mit der JavaScript-Methode 'getTime()' möglich.

Die Subtraktion von zwei Datumswerten sieht dann so aus:
var DatumHeute = new Date();
var DatumVergleich = new Date(2020,11,24);

var Differenz01 = DatumVergleich.getTime() - DatumHeute.getTime()
Das Ergebnis der Berechnung wird in die Variable 'Differenz01' geschrieben.




Querverweis:

Ein Beispiel das aufzeigt, wie man zu einem Datumswert eine Zeitspanne hinzurechnet finden Sie auf einer separaten Beispielseite. Dort erkläre ich, wie Sie zu einem Datumswert z.B. 20 Tage hinzurechnen.

DatumZukunft = DatumHeute + 20 Tage  |  DatumVergangenheit = DatumHeute - 20 Tage

Zeitspanne addieren / subtrahieren (Tage)

[siehe auch: Methode parse(), zur Umwandlung eines Textstrings in einen Millisekundenwert]



3  Umrechnen

Nun hätte ich allerdings gerne die Differenz als einen Wert in Tagen! Folglich muss ich den Millisekundenwert noch durch die Anzahl der Millisekunden je Tag dividieren.

1 Tag = 24 Std * 60 Min * 60 Sek * 1000 ms
entspricht 86400000 Millisekunden / Tag

Ich muss also durch 86400000 ms / Tag teilen!

var Differenz01 = (DatumVergleich.getTime() - DatumHeute.getTime()) / 86400000


Das mag ja beeindruckend sein, ganz schön viele Nachkommastellen. Ist aber nicht was ich mir vorstelle. Schließlich möchte ich mit dem Ergebnis in Tagen als ganze Zahl später weitere Berechnungen oder Vergleiche anstellen.



4  Runden

a) aufrunden  nächst höhere Interger (Ganzzahl)
var Differenz02 = Math.ceil(Differenz01)


b) abrunden  nächst niedere Interger (Ganzzahl)
var Differenz02 = Math.floor(Differenz01)


c) runden  nächste Interger (Ganzzahl)
var Differenz02 = Math.round(Differenz01)




5  Vergleichen + Rechnen

Jetzt können Sie weitere Berechnungen oder Vergleiche anstellen. Sie könnten das Ergebnis z.B. durch 7 oder 365 teilen um die Anzahl der Wochen oder Jahre zu berechnen. Oder Sie berechnen wie viele Mondzyklen während dieser Zeit durchlaufen werden:

Wie oft sehe ich den Vollmond während dieser Zeit?
<script type="text/javascript" language="JavaScript">
<!--
AnzahlTage = (DatumVergleich.getTime() - DatumHeute.getTime()) / 86400000;
var MondPeriode = 29.53059027;
var Mondzyklen = Math.round(AnzahlTage / MondPeriode);
document.write('Ergebnis: Vollständige Mondzyklen ' + Mondzyklen);
//-->
</script>



Für Vergleiche bieten sich if-Abfragen an:

wenn Anzahl der Tage genau 1 ist
if ( Differenz02 == 1 )
{
... tu was (nur noch 1 Tag)
}

wenn Anzahl der Tage größer als 365
if ( Differenz02 > 365 )
{
... tu was (mehr als 1 Jahr)
}

wenn Anzahl der Tage größer als 1 und  Anzahl der Tage kleiner / gleich 10
if ( Differenz02 > 1 && Differenz02 <= 10 )
{
... tu was
}

wenn Anzahl der Tage kleiner / gleich Null ist
if ( Differenz02 <=  0 )
{
... tu was (Termin verstrichen)
}



   Zusammenfassung

Eine einfach JavaScript-Funktion zur Verarbeitung von 2 Datumswerten erstellen. Das hört sich oft komplizierter an als es in Wirklichkeit ist: Zwei Datumswerte subtrahieren / addieren und möglicherweise noch ein wenig multiplizieren / dividieren.
<script type="text/javascript" language="JavaScript">
<!--

var DatumHeute = new Date()
var DatumVergleich = new Date(2020,11,24)        // 24.12.2020  (Monatswerte 0-11)

var Differenz01 = DatumVergleich.getTime() - DatumHeute.getTime()
var Differenz02 = Differenz01 / 86400000
var Differenz03 = Math.ceil( Differenz01 / 86400000 )

document.write('Anzahl der Tage während der Zeitspanne: ' + Differenz03);

//-->
</script>
Differenz01 entspricht Abstand in Millisekunden
Differenz02 entspricht Abstand in Tagen
Differenz03 entspricht Abstand in Tagen gerundet

Ein so berechneter Differenzwert kann dann für einen Vergleich (mit if/else oder case) eingesetzt werden. Man könnte auch direkt abfragen "ist DatumVergleich größer als DatumHeute".

Der Rechenweg über den Differenzwert lässt eine spätere Erweiterung zu, wenn man z.B. zusätzlich unterscheiden will "ist der Termin um 10 Tage überschritten?", "steht der Termin in den nächsten 20 Tagen an?", ...








Zeitspanne addieren

Zeitspanne addieren / subtrahieren (Tage)

periodische Liste

Grafik datumsanhängig 03 - Grafik + Text

Grafik datumsanhängig 04 - Grafik + Datum + Text

Grafik + Text - Liste der Termine mit Grafik - jahresübergreifend

Liste der Termine jahresübergreifend - Kalenderblatt + Tagescounter + Text




   Untersuchung


Nur für Tüftler, Skeptiker (wie mich) und Entdecker

Ich habe behauptet:
  1. "Ein Date-Objekt beinhaltet die Anzahl der Millisekunden seit dem 01.01.1970, 0:00 Uhr."

  2. "Die Methode 'getTime()' liefert die Anzahl Millisekunden als Zahl zurück, die seit dem 1. Januar 1970, 0:00:00 Uhr vergangen sind."
Demnach kann ich mit den beiden Date-Objekten DatumVergleich und DatumHeute gleich rechnen. Das wurde oben ja bereits bewiesen. Was geschieht wenn ich zuerst die Millisekundenwerte mit der Methode 'getTime()' entnehme und damit weiter arbeite?

Macht das einen Unterschied? Ist es möglicherweise so, das bei den Berechnungen unterschiedliche Variablentypen generiert werden? Machen wir den Test:



Rechnen 1

Die 'Umwandlung' in Millisekunden (besser die 'Entnahme' des Millisekundenwertes) aus einem Date-Objekt ist mit der JavaScript-Methode 'getTime()' möglich.

[siehe auch: Methode parse(), zur Umwandlung eines Textstrings in einen Millisekundenwert]

Die Subtraktion von zwei Datumswerten sieht dann so aus:
var DatumHeute = new Date();
var DatumVergleich = new Date(2020,11,24);

var Differenz01 = DatumVergleich.getTime() - DatumHeute.getTime()
Das Ergebnis der Berechnung wird in die Variable 'Differenz01' geschrieben.





Rechnen 2

Die Subtraktion von zwei Datumswerten sieht dann so aus:
var DatumHeute = new Date();
var DatumVergleich = new Date(2020,11,24);

var Differenz02 = DatumVergleich - DatumHeute
Das Ergebnis der Berechnung wird in die Variable 'Differenz01' geschrieben.