Warum gibt Javascript getYear() eine dreistellige Zahl zurück?

Lesezeit: 5 Minuten

ctrlShiftBryans Benutzeravatar
ctrlShiftBryan

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

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

Jahr = 108?

  • Oh, die Sünden, die wir begangen haben, als wir versuchten, das Jahr 2000 zu überstehen.

    – DGentry

    18. September 2008 um 23:59 Uhr

  • year = myDate.getFullYear() % 100;

    – Andreas Larson

    4. Dezember 2012 um 20:01 Uhr


Benutzeravatar von ConroyP
ConroyP

Es ist ein Y2K Dabei werden nur die Jahre seit 1900 gezählt.

Es gibt jetzt potenzielle Kompatibilitätsprobleme getYear() wurde zugunsten von verworfen getFullYear() – aus Quirksmodus:

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

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

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

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

Gemäß der ECMAScript-Spezifikation gibt getYear das Jahr minus 1900 zurück, das ursprünglich „98“ für 1998 zurückgeben sollte. getYear war in ECMAScript Version 3 veraltet und wurde durch getFullYear() ersetzt.

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

  • Ich frage mich wirklich, was Idiot dachte, das war eine gute Idee. Wer schafft ein Y2K-Problem 5 Jahre nach Y2k?

    – Dakkaron

    15. September um 13:48 Uhr

Da getFullYear in älteren Browsern nicht funktioniert, können Sie so etwas 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 C#-Erweiterungsmethoden. Jetzt können wir das einfach tun;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008

  • Vielleicht etwas wie Date.prototype.getRealYear = Date.prototype.getFullYear ? Date.prototype.getFullYear : function() { return this.getYear() + 1900; };

    – Valentin Golev

    25. November 2009 um 14:43 Uhr

Benutzeravatar von skiphoppy
überspringen

Überprüfen Sie die Dokumente. Es ist kein Jahr-2000-Problem – es ist das Fehlen eines Jahr-2000-Problems! Diese Entscheidung wurde ursprünglich in C getroffen und in Perl kopiert, anscheinend in JavaScript und wahrscheinlich in mehrere andere Sprachen. Vor so langer Zeit wurde es anscheinend noch als wünschenswert empfunden, zweistellige Jahreszahlen zu verwenden, aber bemerkenswerterweise hatte derjenige, der diese Schnittstelle entworfen hat, genug Voraussicht, um zu erkennen, dass er darüber nachdenken musste, was im Jahr 2000 und darüber hinaus passieren würde, also anstatt nur die letzten beiden bereitzustellen Ziffern, sie gaben die Anzahl der Jahre seit 1900 an. Sie konnten die zwei Ziffern verwenden, wenn Sie es eilig hatten oder riskant sein wollten. Oder wenn Sie möchten, dass Ihr Programm weiterhin funktioniert, können Sie 1900 zum Ergebnis hinzufügen und vollwertige vierstellige Jahreszahlen verwenden.

Ich erinnere mich an das erste Mal, als ich Datumsmanipulationen in Perl durchführte. Seltsamerweise ich Lesen Sie die Dokumente. Anscheinend ist dies nicht üblich. 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, Dinge, mit denen ich nie etwas zu tun hatte. Es war genau dieses Problem: Der Standard-Datumsaufruf gab Jahre seit 1900 zurück, und die Programmierer behandelten es als zweistellige Jahreszahl. (Sie gingen davon aus, dass sie im Jahr 2000 “00” bekommen würden.) Als junger, unerfahrener Programmierer war ich verblüfft, dass wir für einen “professionellen” Job so viel extra bezahlt hatten und diese Leute sich nicht einmal die Mühe gemacht hatten, die 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-Bugs als “YAPC 19100” bezeichnet.

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

  • hehe… erinnert mich an den Dilbert Cartoon… “Hast du die Geschichte über einen Spanier namens Manual gelesen?” 😉

    – Adhip Gupta

    20. September 2008 um 21:54 Uhr

  • Ich glaube, @skiphoppy bedeutete, dass das Hinzufügen von 1900 zu getYear() das gewünschte volle Jahr ergeben würde. Es ist vergleichbar mit dem Hinzufügen von +1 zu getMonth() beim Abrufen der für Menschen lesbaren Zahl des Monats. Beispiel: var ts = new Date(); var fullYear = (ts.getYear()+1900); Die Verwendung von getFullYear() wird jedoch bevorzugt. Beispiel: var fullYear = new Date().getFullYear();

    – Rückfall

    18. Mai 2018 um 13:14 Uhr


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

Dans Benutzeravatar
Dan

verwenden date.getFullYear().

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

Spätere Browser werden unterstützt getFullYear als Standardmethode, um das komplette Jahr zurückzugeben.

Benutzeravatar von jjohn
jjohn

Diese Frage ist so alt, dass ich vor Nostalgie für 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 Sprache, die in den 1990er Jahren entworfen wurde, den Jahrhundertwechsel nicht erklären würde, aber was soll ich sagen? Du musstest da sein. Es machte damals irgendwie Sinn (wie es pets.com tat).

Vor 2000 war man vielleicht versucht, diesen Fehler zu beheben, indem man “19” an das Ergebnis von getYear() anhängte, was zu dem führte “Jahr 19100 Fehler”. Andere haben diese Frage bereits ausreichend beantwortet (addiere 1900 zum Ergebnis von getDate()).

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

Danke für die Explosion aus der Vergangenheit!

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

Die Geschichte ist jedoch nicht so einfach wie “IE implementiert GetYear() wie getFullYear(). Opera und IE behandeln diese Tage getYear() wie getYear() wurde ursprünglich für Daten vor 2000 angegeben, wird aber so behandelt getFullYear() für Daten nach 2000, während Webkit und Firefox beim alten Verhalten bleiben

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());

1407280cookie-checkWarum gibt Javascript getYear() eine dreistellige Zahl zurück?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy