Christian Seiler: Funktion mit Rückgabe des Datums vor 365 Tagen

Beitrag lesen

Hallo Mathias,

kann mir jemand einen Tipp geben was ich hierbei noch falsch mache. Ich möchte eine Funktion erstellen die als Paramater z.B. den wert 20080227 übergeben bekommt und soll von dieser 365 Tage abziehen.

Sowas rechnest Du besser über den Julianischen Tag: Der Julianische Tag (Julian Day) ist gleich der Zahl der seit dem 1.1. -4713 (bezogen auf den Gregorianischen Kalender) abgelaufenen Tage.

Warum eigentlich, was hat das für Vorteile? (Ernsthafte, keine zweifelnde Frage, würde mich halt interessieren.)

Ich kann in JavaScript einem Unix-Timestamp einfach 365 Tage abziehen, was ist daran nicht ausreichend? (Vor der Unix-Epoch wird der Timestamp halt negativ, Daten sind aber darstellbar.)

Naja, es gibt da zwei Vorteile:

1. Kleinere Zahlen: Wenn man Sekunden oder Millisekunden nimmt, dann kann
   es sehr gut sein, dass man das nicht mehr als Ganzzahl darstellen kann.
   Dann gibt's in einigen Programmiersprachen überläufe, was extrem häßlich
   ist und andere Programmiersprachen greifen dann auf Gleitkommazahlen
   zurück - was aber zu einem Verlust in Genauigkeit führt (was aber im
   Gegensatz zu Überläufen im Zweifel noch verschmerzbar ist).

2. Sommer- und Winterzeit: Das Problem ist, das man immer dazu neigt,
   Lokalzeit zu betrachten - die ist aber nicht kontinuierlich, weil ein
   Tag durchaus mal 25 oder nur 23 Stunden haben kann wegen Umstellungen
   von Sommer- auf Winterzeit. Dies führt dann bei Berechnungen zu
   Problemen.

Als Beispiel: Zwischen dem 25. Oktober 2008 12:00 Lokalzeit Berlin und
   dem 27. Oktober 2008 12:00 Lokalzeit Berlin liegen 49 Stunden und nicht
   bloß 48 Stunden. Wenn man also auf den 25. Oktober 2008 00:00 Lokalzeit
   Berlin 48 Stunden addiert und sich dann nur den Datumsteil ausgeben
   lässt, landet man nicht mehr beim 27. Oktober 2008, sondern nur beim
   26. Oktober 2008 (halt um 23:00, aber die Information schmeißt man ja
   weg).

Man kann das umgehen, wenn man immer in UTC rechnet. Dann ist nämlich
   auch die Zeitskala kontinuierlich (Schaltsekunden werden in JS sowieso
   nicht berücksichtigt) und man kann wirklich mit Vielfachen von 86400
   Sekunden arbeiten. Wenn man das berücksichtigt und sich in Bereichen
   bewegt, in denen die Zahlen nicht zu groß werden, spricht also nichts
   gegen die Verwendung von Timestamps auf Sekunden/Millisekundenbasis.
   Man muss aber immer aufpassen, dass man nie in die Lokalzeitfalle tappt.

Viele Grüße,
Christian