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?
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?
year = myDate.getFullYear() % 100;
Odpowiedzi:
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.
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
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.
Musi zwracać liczbę lat od roku 1900.
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 98
z getYear()
. Zamiast wracać do00
, powrócił 100
w 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 getFullYear
jako standardowa metoda zwracania pełnego roku.
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!
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());
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.
Otrzymana liczba to liczba lat od 1900 roku. Nie pytaj mnie dlaczego ...
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ść.
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 ().
var date_object = new Date (); var rok = date_object.getYear (); if (rok <2000) {rok = rok + 1900; } // dostaniesz cały rok ....