Stefan: getYear() in Mozilla, IE und Opera

Hi Leute,

Ich hab das Problem das folgendes Javascript nicht richtig funktioniert, bzw es kommt nicht das raus was rauskommen sollte:

<script type="text/javascript">

var d_day   = '19';
  var d_month = '7';
  var d_year  = '2004';

d_date      = new Date(d_year,d_month,d_day);

alert ('Year: ' + d_date.getYear() + '');

</script>

d_date.getYear() sollte "2004" sein doch bei Mozilla 1.7.1, Firefox 1.9.2 und Opera 7.52 kommt "104" raus. Nur der IE sagt "2004".

An was kann das liegen? Ist das Script falsch?

MFG
Stefan

  1. Hallo,

    d_date.getYear() sollte "2004" sein doch bei Mozilla 1.7.1, Firefox 1.9.2 und Opera 7.52 kommt "104" raus. Nur der IE sagt "2004".

    An was kann das liegen? Ist das Script falsch?

    Die Methode getYear() gibt die Anzahl der seit 1900 vergangenen Jahre zurueck, also korrekt 104. Verwende getFullYear() fuer die vierstellige Jahreszahl.

    MfG, Thomas

    1. Die Methode getYear() gibt die Anzahl der seit 1900 vergangenen Jahre zurueck, also korrekt 104. Verwende getFullYear() fuer die vierstellige Jahreszahl.

      MfG, Thomas

      Danke Thomas :)

      Selfhtml erläutert die Funktion etwas seltsam:
      http://de.selfhtml.org/javascript/objekte/date.htm#get_year

    2. Moin Moin !

      Die Methode getYear() gibt die Anzahl der seit 1900 vergangenen Jahre zurueck, also korrekt 104. Verwende getFullYear() fuer die vierstellige Jahreszahl.

      Tja, nur gibt's getFullYear() nicht überall. Workaround: siehe [pref:t=85173&m=501318]

      Alexander

      --
      Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  2. Hi,

    d_date.getYear() sollte "2004"

    WAAAAAS?! Wir haben schon das Jahr 3904? Himmel, ich hab' verschlafen ...

    (new Date()).getYear() ist definiert als die Differenz des aktuellen Jahres zu 1900. Wenn Du etwas anderes möchtest, nimm getFullYear() - unter Berücksichtigung der Tatsache, dass dies nicht in allen Browsern bekannt ist.

    An was kann das liegen? Ist das Script falsch?

    Nein, nur der IE.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. thx, Thomas war schneller ;)

      (new Date()).getYear() ist definiert als die Differenz des aktuellen Jahres zu 1900. Wenn Du etwas anderes möchtest, nimm getFullYear() - unter Berücksichtigung der Tatsache, dass dies nicht in allen Browsern bekannt ist.

      http://de.selfhtml.org/javascript/objekte/date.htm#get_year
      ----------------------------------------------------------------
      Liefert das Jahr des Objekts Objektname als Zahl zurück, beispielsweise 1991, wenn in Objektname der 2.10.1991, 23:59:00, gespeichert ist.

      Mit jetzt.getYear() wird das aktuelle Jahr ermittelt. [..] Manche Browser geben die Jahreszahl noch zweistellig aus. Für diesen Fall wird die Jahreszahl um 1900 erhöht.
      ----------------------------------------------------------------

      Kein Wort von der 1900 Sache.

      Nein, nur der IE.

      War nichts anderes zu erwarten :)

      Stefan

      1. Hi,

        thx, Thomas war schneller ;)

        aber ich habe mehr geschrieben ;-)

        http://de.selfhtml.org/javascript/objekte/date.htm#get_year

        </faq/#Q-19>

        Mit jetzt.getYear() wird das aktuelle Jahr ermittelt. [..] Manche Browser geben die Jahreszahl noch zweistellig aus. Für diesen Fall wird die Jahreszahl um 1900 erhöht.
        Kein Wort von der 1900 Sache.

        Nein, abgesehen von der 1900 Sache, äh ...

        ... Wenn ich mich nicht irre, habe ich den Fehler in der Formulierung vor ein oder zwei Jahren schon mal gemeldet. Richtiger wäre: "Mit jetzt.getYear() wird die Zahl der seit 1900 verstrichenen Jahre ermittelt. [...] Der IE gibt die Jahreszahl bis 1999 korrekt, danach vierstellig aus. Für diesen Fall muss der Wert um 1900 verringert werden.", denn so hat Netscape seinerzeit getYear() definiert.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          Richtiger wäre: "Mit jetzt.getYear() wird die Zahl der seit 1900 verstrichenen Jahre ermittelt. [...] Der IE gibt die Jahreszahl bis 1999 korrekt, danach vierstellig aus.

          Besser wäre besser und ist sogar richtig - glaub ich;)
          Auch auf die Gefahr hin mich unbeliebt zu machen - ich meine noch unbeliebter - möchte ich erwähnen, dass der IE auch die Jahre vor 1990 4-stellig zurückliefert.

          Remarks
          This method is obsolete, and is provided for backwards compatibility only. Use the getFullYear method instead.

          For the years 1900 though 1999, the year is a 2-digit integer value returned as the difference between the stored year and 1900. For dates outside that period, the 4-digit year is returned. For example, 1996 is returned as 96, but 1825 and 2025 are returned as-is.

          Note   For JScript version 1.0, getYear returns a value that is the result of the subtraction of 1900 from the year value in the provided Date object, regardless of the value of the year. For example, the year 1899 is returned as -1 and the year 2000 is returned as 100.
          <

          bernd

          1. dass der IE auch die Jahre vor 1990 4-stellig zurückliefert.

            Muss natürlich "vor 1900" lauten - ich Dussel.

          2. Hi,

            Auch auf die Gefahr hin mich unbeliebt zu machen - ich meine noch unbeliebter - möchte ich erwähnen, dass der IE auch die Jahre vor [1900] 4-stellig zurückliefert.

            argl! Damit machst Du nicht Dich noch unbeliebter, sondern den IE ... :-/

            Danke für die Info.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
          3. Richtiger wäre: "Mit jetzt.getYear() wird die Zahl der seit 1900 verstrichenen Jahre ermittelt. [...] Der IE gibt die Jahreszahl bis 1999 korrekt, danach vierstellig aus.

            Besser wäre besser und ist sogar richtig - glaub ich;)
            Auch auf die Gefahr hin mich unbeliebt zu machen - ich meine noch unbeliebter - möchte ich erwähnen, dass der IE auch die Jahre vor 1990 4-stellig zurückliefert.

            Und um das ganze ein wenig zu ergänzen.

            Netscape 3.01 Gold und IE 4:

            1900-1999: 2 stellig
            < 1900 und > 19999: vierstellig

            Netscape 3 kennt dafür aber die Funktion getFullYear() nicht.

            Struppi.

            1. Moin Moin !

              Ich zitiere mal meine eigene Seite (http://www.foken.de/alexander/projekte/web/browsertest/tricks.html):

              Vorschlag für eigenen Code mit Date.getYear():

              Da nicht jeder Javascript-fähige Browser Date.getFullYear() implementiert, scheidet Date.getFullYear() aus. Man könnte zwar prüfen, ob Date.getFullYear() implementiert ist, aber auch ohne diese Funktion kommt man bis 2899. Wer seinen Code so robust schreiben will, daß er auch nach 2899 noch funktioniert, soll das tun. Ich empfehle, Date.getFullYear() für die nächsten drei Jahrhunderte zu ignorieren, und stattdessen zum Rückgabewert von Date.getYear() 1900 zu addieren, wenn der Rückgabewert kleiner als 1000 ist.

              Beispiel, sicher bis 2899:

              var now=new Date();
              var year=now.getYear();
              if (year<1000) year+=1900;
              document.write('Current Year: '+year);

              Beispiel, sicher auch nach 2899:

              var now=new Date();
              var year;
              if (Date.getFullYear) {
                year=now.getFullYear();
              } else {
                year=now.getYear();
                if (year<1000) year+=1900;
              }
              document.write('Current Year: '+year);

              Alexander

              --
              Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
              Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    2. Hallo,

      An was kann das liegen? Ist das Script falsch?

      Nein, nur der IE.

      Zu den Hintergründen siehe </archiv/2004/4/77852/#m450091>. »Falsch« ist hier eher die jede Logik entbehrende Entwicklung der JavaScript-Spezifikationen von Netscape. Das Gehirn eingeschaltet haben lediglich die Verfasser von ECMAScript: Sie haben dem widersinnigen getYear-Durcheinander durch getFullYear ein Ende bereitet.

      Mathias

      1. Hallo Mathias,

        Zu den Hintergründen siehe </archiv/2004/4/77852/#m450091>. »Falsch« ist hier eher die jede Logik entbehrende Entwicklung der JavaScript-Spezifikationen von Netscape.

        Die Idee ist aber nicht von Netscape. Ich darf aus der UNIX-Manpage für localtime zitieren:

        [...]
               asctime,   ctime,   gmtime,   localtime,  mktime,  asctime_r,  ctime_r,
               gmtime_r, localtime_r - transform date and time to broken-down time  or
               ASCII
        [...]
               Broken-down time is stored in the structure  tm  which  is  defined  in
               <time.h> as follows:

        struct tm {
                              int     tm_sec;         /* seconds */
                              int     tm_min;         /* minutes */
                              int     tm_hour;        /* hours */
                              int     tm_mday;        /* day of the month */
                              int     tm_mon;         /* month */
                              int     tm_year;        /* year */
                              int     tm_wday;        /* day of the week */
                              int     tm_yday;        /* day in the year */
                              int     tm_isdst;       /* daylight saving time */
                      };

        The members of the tm structure are:
        [...]
               tm_year
                      The number of years since 1900.

        Und tm_year enthält unter UNIX dieses Jahr tatsächlich 104. Die Netscape-Leute haben schlichtweg die Funktion getYear() auf dieses Mitglied der struct tm gemappt.

        Und ja, es entbehrt jeglicher Logik, hat jedoch Tradition[tm].

        Viele Grüße,
        Christian