dasnurf: Timer bis zum Ende des Jahres - Fehler

Hallo Forum,

Ich habe ein kleines Javascript gebastelt, dass einen einfachen Countdown bis zum 1.1.2011 darstellt. Allerdings scheine ich einen Fehler gemacht zu haben, denn im Vergleich mit ähnlichen Anzeigen im Internet zählt mein Skript ~20-30 Tage zu viel. Ich poste mal die ganze Funktion, und hebe die Stelle an denen die Tage generiert werden hervor. Vielen dank für die Hilfe!

<script type="text/javascript">

function zeitanzeigen() {
var jetzt = new Date();
var zeit = jetzt.getTime()/1000;
var neujahr = new Date (2011, 1, 1, 0, 0, 0);
var zielzeit = neujahr.getTime ()/1000;
var differenz = Math.round(zielzeit-zeit);
var anzmin = Math.round((differenz % 3600)/60);
var anzsek = differenz % 60;
var anzstd = Math.round((differenz % 86400)/3600);
var anztage = Math.floor(differenz / 86400)
<strong> window.document.Formular.textfeld.value = anztage + ":" + anzstd + ":" + anzmin + ":" + anzsek;</strong>
window.setTimeout("zeitanzeigen()", 1000);
}

</script>

  1. Hallo,

    Ich habe ein kleines Javascript gebastelt, dass einen einfachen Countdown bis zum 1.1.2011 darstellt. Allerdings scheine ich einen Fehler gemacht zu haben, denn im Vergleich mit ähnlichen Anzeigen im Internet zählt mein Skript ~20-30 Tage zu viel.

    kein Wunder ...

    var neujahr = new Date (2011, 1, 1, 0, 0, 0);

    Hier erzeugst du ein Date-Objekt für den 01. Februar 2011. Beachte, dass der Monat ab 0 gezählt wird. Warum das beim Tag nicht ebenso ist, finde ich aber auch seltsam.

    var zielzeit = neujahr.getTime ()/1000;
    var differenz = Math.round(zielzeit-zeit);
    var anzmin = Math.round((differenz % 3600)/60);
    var anzsek = differenz % 60;
    var anzstd = Math.round((differenz % 86400)/3600);
    var anztage = Math.floor(differenz / 86400)

    Du scheinst Math.round() und Math.floor() recht beliebig auszutauschen. Bei solchen Umrechnungen ist Math.round() fast immer die falsche Wahl. Überlege, warum!

    So long,
     Martin

    --
    Funktion und Referenz auf diese sind mir bekannt, mit Zeigern kann ich nicht viel mehr anfangen, als damit auf Buttons zu klicken.
      (Ashura)
    1. Ahja, da hab ich wohl mal wieder nicht lange genug nachgedacht.
      Danke für die Hilfe!

  2. Hallo,

    Allerdings scheine ich einen Fehler gemacht zu haben, denn im Vergleich mit ähnlichen Anzeigen im Internet zählt mein Skript ~20-30 Tage zu viel.

    Wenn man die Formeln selber bastelt, kann das schon mal passieren.
    Lass' doch das http://de.selfhtml.org/javascript/objekte/date.htm#allgemeines@title=Date-Objekt für dich rechnen, z.B. so:

      var neujahr   = new Date (2011, 1, 1, 0, 0, 0),  
          jetzt     = new Date(),  
          differenz = new Date(neujahr - jetzt),  
          anzsek    = differenz.getSeconds(),  
          anzmin    = differenz.getMinutes(),  
          anzstd    = differenz.getHours(),  
          anztage   = Math.floor(differenz / (24*60*60*1000));  
    
    

    24*60*60*1000 ist natürlich die Anzahl Millisekunden pro Tag.

    Gruß, Don P

    1. Hi,

      Allerdings scheine ich einen Fehler gemacht zu haben, denn im Vergleich mit ähnlichen Anzeigen im Internet zählt mein Skript ~20-30 Tage zu viel.
      Wenn man die Formeln selber bastelt, kann das schon mal passieren.

      ja, wenn man sich zum Beispiel des Unterschieds zwischen round() und floor() nicht bewusst ist.

      var neujahr = new Date (2011, 1, 1, 0, 0, 0), ...

      Und den zweiten groben Schnitzer hast du einfach unbemerkt übernommen. ;-)

      So long,
       Martin

      --
      Lache, und die Welt wird mit dir lachen.
      Schnarche, und du schläfst allein.
      1. Hallo,

        var neujahr = new Date (2011, 1, 1, 0, 0, 0), ...

        Und den zweiten groben Schnitzer hast du einfach unbemerkt übernommen. ;-)

        Ja, nicht gesehen... Schande über mich ;)

        Gruß, Don P

    2. Hi!

      24*60*60*1000 ist natürlich die Anzahl Millisekunden pro Tag.

      Bis zum 1.1.2011 gibt es einen Tag mit 25 Stunden. Die Anzahl der Tage hat also bis dahin immer eine Stunde pro Tag falsch.

      Lo!

      1. Hallo,

        24*60*60*1000 ist natürlich die Anzahl Millisekunden pro Tag.

        Bis zum 1.1.2011 gibt es einen Tag mit 25 Stunden. Die Anzahl der Tage hat also bis dahin immer eine Stunde pro Tag falsch.

        Ein Tag hat immer 24*60*60*1000 Sekunden (von den Schaltmillisekunden mal abgesehen).
        Das wird ja von der Sonne bestimmt, und die interessiert sich nicht für unsere Mogeleien mit +/- eine Stunde. Sommer/Winterzeit gibt's auch nicht überall.

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

        Gruß, Don P

        1. 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!