Matthias Apsel: Behandlung zweistelliger Jahreszahlen

Om nah hoo pez nyeetz, alle!

Derzeit machen die Browser bei Datumsoperationen aus dem 10.11.12 ja 10.11.1912. Ist das irgendwo genormt, kann man sich immer drauf verlassen, dass beispielsweise

javascriptdatum = new Date(jahr.value, monat.value-1, tag.value);

bei einem weniger als dreistelligen jahres.wert das zwanzigste Jahrhundert zugrunde liegt?

Matthias

--
1/z ist kein Blatt Papier.

  1. @@Matthias Apsel:

    nuqneH

    Derzeit machen die Browser bei Datumsoperationen aus dem 10.11.12 ja 10.11.1912.

    Kann ich aus der ECMAScript-Spec nicht herauslesen, dass sie das tun sollten.

    Qapla'

    --
    „Perfektion ist nicht dann erreicht, wenn es nichts mehr hinzuzufügen gibt, sondern wenn man nichts mehr weglassen kann.“ (Antoine de Saint-Exupéry)
    1. Hallo,

      Derzeit machen die Browser bei Datumsoperationen aus dem 10.11.12 ja 10.11.1912.
      Kann ich aus der ECMAScript-Spec nicht herauslesen, dass sie das tun sollten.

      kommt drauf an, was Matthias genau meint.

      Ich interpretiere die Spec so, dass im Prinzip immer die volle Jahreszahl verwendet wird. Abschnitt 15.9.2 erklärt jedoch, dass beim Erzeugen eines neuen Date-Objekts Jahreszahlen <100 (also zweistellig) grundsätzlich als 1900+y behandelt werden.

      Das scheint mir aber eher ein Akt der Kulanz zu sein; die Methode getYear(), die das Jahr zweistellig auf 1900 basierend lieferte, ist wohl aus gutem Grund irgendwann dem Rotstift zum Opfer gefallen. SELFHTML erwähnt sie noch, aber das ist auch schon ein paar Jahre alt.

      So long,
       Martin

      --
      Das Leben ist lebensgefährlich und endet meistens tödlich.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. @@Der Martin:

        nuqneH

        Abschnitt 15.9.2 erklärt jedoch, dass beim Erzeugen eines neuen Date-Objekts Jahreszahlen <100 (also zweistellig) grundsätzlich als 1900+y behandelt werden.

        Eher 15.9.3.1. Das war mir entgangen.

        Qapla'

        --
        „Perfektion ist nicht dann erreicht, wenn es nichts mehr hinzuzufügen gibt, sondern wenn man nichts mehr weglassen kann.“ (Antoine de Saint-Exupéry)
      2. Om nah hoo pez nyeetz, Der Martin!

        kommt drauf an, was Matthias genau meint.

        Ich lass in ein Formular eine Jahreszahl eingeben und mache daraus ein Date-Objekt.

        javascriptdatum = new Date(jahr.value, monat.value-1, tag.value);

        Der Abschnitt 15.9.2 liefert mir dann auch die Sicherheit, die ich brauche, denn an einer Stelle rechne ich einfach heutigeJahreszahl - eingegebeneJahreszahl ohne auf die Datumsmethoden zurückzugreifen. Bei einer zweistelligen Eingabe hab ich einfach 1900 hinzugerechnet.

        Durch die Nachfrage möchte ich sicherstellen, dass nicht einige Browser auf die Idee kommen, aus dem 1.2.12 den 1.2.2012 zu machen.

        Ich interpretiere die Spec so, dass im Prinzip immer die volle Jahreszahl verwendet wird. Abschnitt 15.9.2 erklärt jedoch, dass beim Erzeugen eines neuen Date-Objekts Jahreszahlen <100 (also zweistellig) grundsätzlich als 1900+y behandelt werden.

        Matthias

        --
        1/z ist kein Blatt Papier.

        1. Hallo,

          Ich lass in ein Formular eine Jahreszahl eingeben und mache daraus ein Date-Objekt.

          javascriptdatum = new Date(jahr.value, monat.value-1, tag.value);

          Der Abschnitt 15.9.2 liefert mir dann auch die Sicherheit, die ich brauche [...]

          Du meinst nicht 15.9.2, denn dieser Abschnitt beschäftigt sich gerade *nicht* mit der Konstruktor-Methode javascriptnew Date(...), die du verwendest, sondern mit der Funktion javascriptDate(...), die alle Argumente ignoriert und einen String zurückgibt, kein Date-Objekt.
          Zitat aus 15.9.2: The function call Date(…) is not equivalent to the object creation expression new Date(…) with the same arguments.

          Die Sicherheit gibt dir aber der Abschnitt 15.9.3.1 zu javascriptnew Date(...), wo es in Punkt 8 heißt:
          "If y is not NaN and 0 ≤ ToInteger(y) ≤ 99, then let yr be 1900+ToInteger(y); otherwise, let yr be y."
          yr meint das resultierende Jahr und y das dem Konstuktor übergebene Jahr.

          Gruß, Don P