Markus: Kennt JavaScript keine Schaltjahre?

Hallo zusammen,

es mag etwas exotisch klingen, jetzt schon an 2004 zu denken,
aber die Zeit vergeht ja wie im Fluge...

Um ein Script auch für Schaltjahre, genaugenommen den 29.Februar, zu testen,
setze ich das Datum auf eben diesen 29.02.2004. Nun sagen mir diverse Browser
(IE6, NS4, NS6) penetrant, dies sei der 01.03.2004.
Bei allen anderen "echten" Daten geben sie das gesetzte Datum zurück,
nur beim 29.Februar nicht.

Code siehe unten (1 bei Monat bedeutet Februar, hier beginnt JS bei 0 zu zählen,
beim Tag dagegen bei 1, logisch wie immer).

var test_time = new Date();
test_time.setHours(9);
test_time.setDate(29);
test_time.setMonth(1);
test_time.setYear(2004);
alert(test_time);

Any ideas?

Dank und Gruss,
Markus

  1. Hallo Markus

    Um ein Script auch für Schaltjahre, genaugenommen den 29.Februar, zu testen,
    setze ich das Datum auf eben diesen 29.02.2004. Nun sagen mir diverse Browser
    (IE6, NS4, NS6) penetrant, dies sei der 01.03.2004.
    Bei allen anderen "echten" Daten geben sie das gesetzte Datum zurück,
    nur beim 29.Februar nicht.

    der Fehler ist recht simpel. Führe mal folgendes Beispiel aus und versuche nachzuvollziehen, was da warum passiert:

    var test_time = new Date();
    document.write("Jetzt: ",test_time.toGMTString(),"<br>");
    test_time.setHours(9);
    document.write("Stunde: ",test_time.toGMTString(),"<br>");
    test_time.setMonth(1);
    document.write("Monat: ",test_time.toGMTString(),"<br>");
    test_time.setDate(29);
    document.write("Tag: ",test_time.toGMTString(),"<br>");
    test_time.setYear(2000);
    document.write("Jahr: ",test_time.toGMTString(),"<br>");

    document.write("<hr>");
    var test_time = new Date();
    document.write("Jetzt: ",test_time.toGMTString(),"<br>");
    test_time.setHours(9);

    test_time.setYear(2000);
    document.write("Jahr: ",test_time.toGMTString(),"<br>");

    document.write("Stunde: ",test_time.toGMTString(),"<br>");
    test_time.setMonth(1);
    document.write("Monat: ",test_time.toGMTString(),"<br>");
    test_time.setDate(29);
    document.write("Tag: ",test_time.toGMTString(),"<br>");

    document.write("<hr>");
    var test_time = new Date();
    document.write("Jetzt: ",test_time.toGMTString(),"<br>");
    test_time.setHours(9);

    test_time.setYear(2000);
    document.write("Jahr: ",test_time.toGMTString(),"<br>");

    document.write("Stunde: ",test_time.toGMTString(),"<br>");
    test_time.setMonth(13);
    document.write("Monat (+13 Monate): ",test_time.toGMTString(),"<br>");
    test_time.setDate(29);
    document.write("Tag: ",test_time.toGMTString(),"<br>");

    document.write("<hr>");
    var test_time = new Date();
    document.write("Jetzt: ",test_time.toGMTString(),"<br>");
    test_time.setHours(9);

    test_time.setYear(2000);
    document.write("Jahr: ",test_time.toGMTString(),"<br>");

    document.write("Stunde: ",test_time.toGMTString(),"<br>");
    test_time.setMonth(1);
    document.write("Monat:  ",test_time.toGMTString(),"<br>");
    test_time.setDate(60);
    document.write("Tag (+60 Tage): ",test_time.toGMTString(),"<br>");

    Als Hilfestellung noch einen Satz aus der Netscapedoku:

    If a parameter you specify is outside of the expected range, setMonth attempts to update the date information in the Date object accordingly. For example, if you use 15 for monthValue, the year will be incremented by 1 (year + 1), and 3 will be used for month.

    Viele Grüße

    Antje

    1. Hallo Antje,

      die Reihenfolge des Datumssetzens war es, wie in Deinem
      zweiten Code-Päckchen: erst Jahr, dann Monat, dann Tag.

      Grossdank und Gruss,
      Markus