Dlaczego JavaScript getYear () zwraca 108?

95

Dlaczego ten javascript zwraca 108 zamiast 2008? ma prawidłowy dzień i miesiąc, ale nie rok?

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

rok = 108?

ctrlShiftBryan
źródło
29
Och, grzechy, które popełniliśmy, próbując przejść przez rok 2000.
DGentry,
3
year = myDate.getFullYear() % 100;
Andrew Larsson

Odpowiedzi:

128

To kwestia Y2K , liczone są tylko lata od 1900 roku.

Istnieją teraz potencjalne problemy ze zgodnością, które getYear()zostały wycofane na korzyść getFullYear()- od quirksmode :

Aby sprawa była jeszcze bardziej złożona, date.getYear () jest obecnie przestarzała i powinieneś używać date.getFullYear (), która z kolei nie jest obsługiwana przez starsze przeglądarki. Jeśli jednak działa, zawsze powinien podawać pełny rok, tj. 2000 zamiast 100.

Twoja przeglądarka podaje kolejne lata za pomocą tych dwóch metod:

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

Istnieją również różnice implementacyjne między przeglądarką Internet Explorer i Firefox, ponieważ implementacja IE getYear()została zmieniona, aby zachowywać się jak getFullYear()- od IBM :

Zgodnie ze specyfikacją ECMAScript, getYear zwraca rok pomniejszony o 1900, co pierwotnie miało zwrócić "98" za rok 1998. Funkcja getYear została wycofana w ECMAScript w wersji 3 i zastąpiona przez getFullYear ().

Internet Explorer zmienił metodę getYear (), aby działała jak getFullYear () i uczyniła ją zgodną z Y2k, podczas gdy Mozilla zachowała standardowe zachowanie.

Conroy P.
źródło
25

Ponieważ getFullYear nie działa w starszych przeglądarkach, możesz użyć czegoś takiego:

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

Prototyp JavaScript może służyć do rozszerzania istniejących obiektów, podobnie jak metody rozszerzające C #. Teraz możemy to zrobić;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008
FlySwat
źródło
7
Może coś takiego jak Date.prototype.getRealYear = Date.prototype.getFullYear? Date.prototype.getFullYear: function () {return this.getYear () + 1900; };
Valentin Golev
12

Sprawdź dokumenty. To nie jest problem roku 2000 - to brak problemu roku 2000! Ta decyzja została podjęta pierwotnie w C i została skopiowana do Perla, najwyraźniej JavaScript i prawdopodobnie kilku innych języków. Dawno temu najwyraźniej nadal wydawało się pożądane, aby używać dwucyfrowych lat, ale zadziwiająco każdy, kto zaprojektował ten interfejs, miał dość przewidywania, aby zdać sobie sprawę, że musi pomyśleć o tym, co stanie się w roku 2000 i później, więc zamiast podawać tylko ostatnie dwa cyfry, podali liczbę lat od 1900 roku. Możesz użyć dwóch cyfr, jeśli się spieszysz lub chcesz ryzykować. Lub jeśli chcesz, aby Twój program nadal działał, możesz dodać 100 do wyniku i użyć pełnoprawnych czterocyfrowych lat.

Pamiętam, jak pierwszy raz manipulowałem datą w Perlu. O dziwo, przeczytałem dokumenty . Najwyraźniej nie jest to powszechne. Rok lub dwa później wezwano mnie do biura 31 grudnia 1999 r., Aby naprawić błąd, który został wykryty w ostatniej możliwej chwili w jakimś kontraktowym kodzie Perla, rzecz, z którą nigdy nie miałem nic wspólnego. Chodziło dokładnie o tę kwestię: standardowe wywołanie daty zwracało lata od 1900 roku, a programiści traktowali to jako rok dwucyfrowy. (Zakładali, że dostaną „00” w 2000 roku). Jako młody, niedoświadczony programista, zszokowało mnie, że zapłaciliśmy tyle ekstra za pracę „profesjonalną”, a ci ludzie nawet nie zadali sobie trudu, aby przeczytać dokumentacja. To był początek wielu lat rozczarowań; teraz jestem stary i cyniczny. :)

W 2000 roku coroczna konferencja YAPC Perl była nazywana „YAPC 19100” na cześć tego często zgłaszanego braku błędu.

W dzisiejszych czasach, przynajmniej w świecie Perla, bardziej sensowne jest użycie standardowego modułu do obsługi dat, który wykorzystuje prawdziwe czterocyfrowe lata. Nie wiem, co może być dostępne dla JavaScript.

skiphoppy
źródło
1
hehe ... przypomina mi kreskówkę Dilberta ... "czy czytałeś historię o Hiszpanie imieniem Manual?" ;)
Adhip Gupta
Uważam, że @skiphoppy oznaczało dodanie 1900 do getYear () dałoby pożądany pełny rok. Jest to podobne do dodawania +1 do funkcji getMonth () podczas pobierania czytelnej dla człowieka liczby miesiąca. Przykład: var ts = new Date (); var fullYear = (ts.getYear () + 1900); Jednak preferowane jest użycie metody getFullYear (). Przykład: var fullYear = new Date (). GetFullYear ();
powtórzyć
6

Musi zwracać liczbę lat od roku 1900.

Jeremy Ruten
źródło
4

używać date.getFullYear().

To jest (jak słusznie wskazano w innym miejscu) jest to sprawa roku 2000. Netscape (napisany przed 2000 rokiem) pierwotnie zwrócony, na przykład 98z getYear(). Zamiast wracać do00 , powrócił 100w roku 2000. Potem pojawiły się inne przeglądarki i zrobiły to inaczej i wszyscy byli nieszczęśliwi, ponieważ panowała niezgodność.

Późniejsze przeglądarki były obsługiwane getFullYearjako standardowa metoda zwracania pełnego roku.

Dan
źródło
3

To pytanie jest tak stare, że płaczę z nostalgii za dniami dotcomów!

Zgadza się, Date.getYear () zwraca liczbę lat od 1900 roku, podobnie jak localtime () w Perlu. Można się zastanawiać, dlaczego język zaprojektowany w latach 90. nie uwzględniałby przemian stulecia, ale co mogę powiedzieć? Trzeba było tam być. W tamtym czasie miało to jakiś sens (tak jak zwierzęta. Com).

Przed 2000 rokiem można było pokusić się o naprawienie tego błędu przez dodanie „19” do wyniku getYear (), co spowodowało „błąd roku 19100” . Inni już odpowiedzieli wystarczająco na to pytanie (dodaj 1900 do wyniku getDate ()).

Może książka, którą czytasz o JavaScript jest trochę stara?

Dzięki za podmuch z przeszłości!

jjohn
źródło
Powodem, dla którego język (Perl) tego nie uwzględnił, jest to, że ślepo kopiował decyzję dotyczącą projektu C, która została podjęta znacznie wcześniej. (20 lat?)
skiphoppy
Rzucałem cień na JavaScript, a nie Perl. Perl często bezpośrednio ujawnia podstawowe procedury C. Jak mówisz, jest to produkt czasu. JS, zaprojektowany przynajmniej dekadę później, mógł pójść inną drogą.
jjohn
2

Jak wskazano, nigdy nie należy używać getYear(), ale zamiast tego używaćgetFullYear() .

Historia nie jest jednak tak prosta, jak „implementacje IE GetYear()jak getFullYear(). Opera i IE obecnie traktują getYear()tak, jak getYear()pierwotnie określono dla dat sprzed 2000 r., Ale będą traktować je jako getFullYear()daty po 2000 r., Podczas gdy webkit i Firefox trzymają się starego zachowania

To daje 99 we wszystkich przeglądarkach:

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

To daje 108 w FF / WebKit i 2008 w Operze / IE:

javascript:alert(new Date().getYear());
Arve
źródło
1

To głupie. To pochodzi z pre-Y2K dni , a teraz po prostu zwraca liczbę lat od roku 1900 ze względów starszych. Użyj getFullYear (), aby uzyskać rzeczywisty rok.

joelhardi
źródło
1

Używam date.getUTCFullYear(); działa bez problemów.

D3vito
źródło
0

Otrzymana liczba to liczba lat od 1900 roku. Nie pytaj mnie dlaczego ...

Nils Pipenbrinck
źródło
0

Jak powiedzieli inni, zwraca liczbę lat od 1900 roku. Powodem tego jest fakt, że kiedy wynaleziono JavaScript w połowie lat 90., zachowanie to było zarówno wygodne, jak i spójne z interfejsami API dat i godzin w innych językach. Szczególnie C. I, oczywiście, po utworzeniu API nie mogli go zmienić ze względu na wsteczną kompatybilność.

user11318
źródło
0

Przy okazji, różne przeglądarki mogą zwracać różne wyniki, więc lepiej całkowicie pominąć tę funkcję i zawsze używać metody getFullYear ().

Milan Babuškov
źródło
0

var date_object = new Date (); var rok = date_object.getYear (); if (rok <2000) {rok = rok + 1900; } // dostaniesz cały rok ....


źródło
-1

powraca czterocyfrowy rok - 1900, który być może był fajny 9+ lat temu, ale teraz jest dość opóźniony. Robi to również java.util.Date w Javie.

user17163
źródło