dedlfix: Timer bis zum Ende des Jahres - Fehler

Beitrag lesen

Hi!

Ein Tag hat immer 24*60*60*1000 Sekunden (von den Schaltmillisekunden mal abgesehen).

Die Schaltsekunden werden bei der Computerei in der Regel nicht berücksichtigt. Die kann man für übliche Anwendungen als nicht existent ansehen. Und der Tag hat nur bei UTC 24 Stunden. Wenn du also lokalzeitunabhängig arbeiten willst, musst du mit UTC arbeiten.

Denke, das Date-Objekt rechnet mit der wirklich verstrichenen Zeit (UTC), so dass die Rechnung auf jeden Fall stimmt, was den wirklichen Zeitraum angeht.

Sie stimmt sogar an zwei Stellen nicht. Die eine ist die Anzahl der Tage, über die man streiten kann.

var neujahr   = new Date(2011, 0, 1, 0, 0, 0),
    jetzt     = new Date(2010, 4, 1, 0, 0, 0),
    differenz = new Date(neujahr - jetzt),
    anztage   = differenz / (24*60*60*1000);
alert(anztage);

Das Runden mal bewusst weggelassen ergibt das keine ganze Zahl sondern 245.04166. Erst um 1 Uhr bekommst du 245 und danach erst 244.irgendwas. Soweit so richtig, aber umgangssprachlich würde auch bei Sommerzeit nicht erst ab 1 Uhr sagen, "noch x Tage bis Weihnachten". Insofern ist das ohne weitere Erklärung für den Anwender etwas verwirrend, wenn die Anzeige erst um 1 umspringt. Na gut, man hat noch die Anzahl der Stunden dazu, wäre da nicht der zweite Fehler, diesmal ein echter.

Und der betrifft die Anzahl der Stunden. Die darf nicht mit differenz.getHours() sondern muss mit differenz.getUTCHours() ermittelt werden. differenz wird nämlich nicht nur als reine Anzahl der Sekunden behandelt sondern auch als ganz normales Datum mit Uhrzeit angesehen. Wenn man sich das ausgeben lässt, bekommt man 3. September 1970 3 Uhr MESZ. Die 3 Uhr ergibt sich aus der einen Stunde, die durch die Zeitverschiebung hinzugefügt wurde und die anderen zwei Stunden ist die aktuelle Differenz zu UTC. Durch getUTCHours() wird die Differenz zu UTC nicht berücksichtigt und man bekommt korrekt 1 als Ergebnis.

Lo!