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