Warum gibt Javascript getYear () 108 zurück?

95

Warum gibt dieses Javascript 108 statt 2008 zurück? es wird der Tag und der Monat richtig, aber nicht das Jahr?

myDate = new Date();
year = myDate.getYear();

Jahr = 108?

ctrlShiftBryan
quelle
29
Oh, die Sünden, die wir begangen haben, als wir versucht haben, durch das Jahr 2000 zu kommen.
DGentry
3
year = myDate.getFullYear() % 100;
Andrew Larsson

Antworten:

128

Es ist eine Y2K- Sache, nur die Jahre seit 1900 werden gezählt.

Es gibt jetzt potenzielle Kompatibilitätsprobleme, getYear()die zugunsten von getFullYear()- from quirksmode :

Um die Angelegenheit noch komplexer zu gestalten, ist date.getYear () heutzutage veraltet und Sie sollten date.getFullYear () verwenden, was wiederum von den älteren Browsern nicht unterstützt wird. Wenn es jedoch funktioniert, sollte es immer das ganze Jahr geben, dh. 2000 statt 100.

Ihr Browser gibt die folgenden Jahre mit diesen beiden Methoden an:

* The year according to getYear(): 108
* The year according to getFullYear(): 2008

Es gibt auch Implementierungsunterschiede zwischen Internet Explorer und Firefox, da die Implementierung von IE getYear()geändert wurde, um sich wie folgt zu verhalten getFullYear()- von IBM :

Gemäß der ECMAScript-Spezifikation gibt getYear das Jahr minus 1900 zurück, das ursprünglich für 1998 "98" bedeuten sollte. GetYear wurde in ECMAScript Version 3 nicht mehr unterstützt und durch getFullYear () ersetzt.

Internet Explorer hat getYear () so geändert, dass es wie getFullYear () funktioniert und Y2k-kompatibel ist, während Mozilla das Standardverhalten beibehält.

ConroyP
quelle
25

Da getFullYear in älteren Browsern nicht funktioniert, können Sie Folgendes verwenden:

Date.prototype.getRealYear = function() 
{ 
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900; 
};

Der Javascript-Prototyp kann verwendet werden, um vorhandene Objekte zu erweitern, ähnlich wie bei C # -Erweiterungsmethoden. Jetzt können wir das einfach tun;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008
FlySwat
quelle
7
Vielleicht etwas wie Date.prototype.getRealYear = Date.prototype.getFullYear? Date.prototype.getFullYear: function () {return this.getYear () + 1900; };
Valentin Golev
12

Überprüfen Sie die Dokumente. Es ist kein Y2K-Problem - es fehlt ein Y2K-Problem! Diese Entscheidung wurde ursprünglich in C getroffen und in Perl, anscheinend JavaScript, und wahrscheinlich in mehrere andere Sprachen kopiert. Vor langer Zeit schien es anscheinend immer noch wünschenswert, zweistellige Jahre zu verwenden, aber bemerkenswerterweise hatte jeder, der diese Schnittstelle entworfen hatte, genug Voraussicht, um zu erkennen, dass er darüber nachdenken musste, was im Jahr 2000 und darüber hinaus passieren würde, anstatt nur die letzten beiden bereitzustellen Ziffern, sie gaben die Anzahl der Jahre seit 1900 an. Sie können die beiden Ziffern verwenden, wenn Sie es eilig haben oder riskant sein möchten. Wenn Sie möchten, dass Ihr Programm weiterhin funktioniert, können Sie dem Ergebnis 100 hinzufügen und vollwertige vierstellige Jahre verwenden.

Ich erinnere mich an das erste Mal, als ich in Perl eine Datumsmanipulation durchgeführt habe. Seltsamerweise habe ich die Dokumente gelesen . Anscheinend ist dies keine alltägliche Sache. Ein oder zwei Jahre später wurde ich am 31. Dezember 1999 ins Büro gerufen, um einen Fehler zu beheben, der in letzter Minute in einem Perl-Vertragscode entdeckt worden war, mit dem ich nie etwas zu tun hatte. Es war genau dieses Problem: Der Standard-Datumsaufruf gab Jahre seit 1900 zurück, und die Programmierer behandelten ihn als zweistelliges Jahr. (Sie gingen davon aus, dass sie im Jahr 2000 "00" bekommen würden.) Als junger unerfahrener Programmierer hat es mich umgehauen, dass wir für einen "professionellen" Job so viel extra bezahlt hatten, und diese Leute hatten sich nicht einmal die Mühe gemacht, das zu lesen Dokumentation. Es war der Beginn vieler Jahre der Ernüchterung; Jetzt bin ich alt und zynisch. :) :)

Im Jahr 2000 wurde die jährliche YAPC Perl-Konferenz zu Ehren dieses oft gemeldeten Nicht-Fehlers als "YAPC 19100" bezeichnet.

Zumindest in der Perl-Welt ist es heutzutage sinnvoller, ein Standardmodul für die Datumsverarbeitung zu verwenden, das echte vierstellige Jahre verwendet. Nicht sicher, was für JavaScript verfügbar sein könnte.

Skiphoppy
quelle
1
hehe ... erinnert mich an den Dilbert-Cartoon ... "Hast du die Geschichte über einen Spanier namens Manual gelesen?" ;)
Adhip Gupta
Ich glaube, @skiphoppy bedeutete, 1900 zu getYear () hinzuzufügen, um das gewünschte volle Jahr zu produzieren. Es ist vergleichbar mit dem Hinzufügen von +1 zu getMonth (), wenn eine vom Menschen lesbare Nummer des Monats abgerufen wird. Beispiel: var ts = new Date (); var fullYear = (ts.getYear () + 1900); Die Verwendung von getFullYear () wird jedoch bevorzugt. Beispiel: var fullYear = new Date (). GetFullYear ();
Rekurs
6

Es muss die Anzahl der Jahre seit dem Jahr 1900 zurückgeben.

Jeremy Ruten
quelle
4

verwenden date.getFullYear().

Dies ist (wie an anderer Stelle richtig ausgeführt) eine Y2K-Sache. Netscape (geschrieben vor 2000) kehrte ursprünglich zurück, zum Beispiel 98von getYear(). Anstatt zurückzukehren, 00kehrte es stattdessen 100für das Jahr 2000 zurück. Dann kamen andere Browser und machten es anders, und alle waren unglücklich, als Inkompatibilität herrschte.

Spätere Browser werden getFullYearals Standardmethode unterstützt, um das gesamte Jahr zurückzugeben.

Dan
quelle
3

Diese Frage ist so alt, dass ich vor Nostalgie über die Dotcom-Tage weinen muss!

Richtig, Date.getYear () gibt die Anzahl der Jahre seit 1900 zurück, genau wie Perls localtime (). Man fragt sich, warum eine in den 1990er Jahren entworfene Sprache nicht den Umsatz des Jahrhunderts ausmachen würde, aber was kann ich sagen? Du musstest da sein. Es machte damals eine Art Sinn (wie es Pets.com tat).

Vor 2000 könnte man versucht gewesen sein, diesen Fehler zu beheben, indem man "19" an das Ergebnis von getYear () anhängt, was zum "Jahr 19100-Fehler" führt . Andere haben diese Frage bereits ausreichend beantwortet (fügen Sie 1900 zum Ergebnis von getDate () hinzu).

Vielleicht ist das Buch, das Sie über JavaScript lesen, etwas alt?

Danke für die Explosion aus der Vergangenheit!

jjohn
quelle
Der Grund, warum die Sprache (Perl) dies nicht berücksichtigt hat, ist, dass sie blind eine C-Entwurfsentscheidung kopiert hat, die viel früher getroffen wurde. (20 Jahre?)
Skiphoppy
Ich habe JavaScript beschattet, nicht Perl. Perl macht häufig zugrunde liegende C-Routinen eher direkt verfügbar. Wie Sie sagen, ist es ein Produkt seiner Zeit. JS, das mindestens ein Jahrzehnt später entworfen wurde, hätte einen anderen Weg gehen können.
John
2

Sie sollten, wie bereits erwähnt, niemals verwenden getYear(), sondern verwenden getFullYear().

Die Geschichte ist jedoch nicht so einfach wie "IE implementiert GetYear()als getFullYear(). Opera und IE behandeln heutzutage getYear()wie getYear()ursprünglich für Daten vor 2000 angegeben, behandeln sie jedoch wie getFullYear()für Daten nach 2000, während Webkit und Firefox am alten Verhalten festhalten

Dies gibt 99 in allen Browsern aus:

javascript:alert(new Date(917823600000).getYear());

Dies gibt 108 in FF / WebKit und 2008 in Opera / IE aus:

javascript:alert(new Date().getYear());
Arve
quelle
1

Es ist dumm. Es stammt aus der Zeit vor dem Jahr 2000 und gibt aus alten Gründen nur noch die Anzahl der Jahre seit 1900 zurück. Verwenden Sie getFullYear (), um das aktuelle Jahr abzurufen.

joelhardi
quelle
1

Ich benutze date.getUTCFullYear(); ohne Probleme arbeiten.

D3vito
quelle
0

Die Zahl, die Sie erhalten, ist die Anzahl der Jahre seit 1900. Fragen Sie mich nicht warum ..

Nils Pipenbrinck
quelle
0

Wie andere gesagt haben, gibt es die Anzahl der Jahre seit 1900. Der Grund , warum es tut , dass ist , dass , wenn Sie in der Mitte der 90er Jahre erfunden wurde, das Verhalten sowohl bequem und im Einklang mit Datum-Zeit - APIs in anderen Sprachen war. Insbesondere C. Und natürlich konnten sie die API nach ihrer Einrichtung aus Gründen der Abwärtskompatibilität nicht mehr ändern.

user11318
quelle
0

Übrigens können verschiedene Browser unterschiedliche Ergebnisse zurückgeben. Es ist daher besser, diese Funktion insgesamt zu überspringen und getFullYear () immer zu verwenden.

Milan Babuškov
quelle
0

var date_object = new Date (); var year = date_object.getYear (); if (Jahr <2000) {Jahr = Jahr + 1900; } // du bekommst das ganze Jahr ....


quelle
-1

es kehrt 4-stelliges Jahr zurück - 1900, das vor mehr als 9 Jahren cool gewesen sein mag, aber jetzt ziemlich zurückgeblieben ist. Javas java.util.Date macht das auch.

user17163
quelle