Opera - problem z obiektem klasy Date
Obiekt klasy Date w Java Script pozwala na poznanie / ustawienie i ogólne manipulowanie datami - dzięki niemu możemy na stronę wstawić zegarek czy zbudować kalendarz w samym JS. Klasa udostępnia wiele metod, mnie w tym momencie najbardziej interesują setMonth i setDate. Poniższy kod:
var d=new Date(); d.setMonth(3); d.setYear(2010); alert(d);
zwróci nam datę - pierwszy kwietnia 2010, z aktualną godziną. Znaczy, zwrócił by o ile nie używasz Opery. Opera (10.51) uparcie twierdzi, że taka data to pierwszy stycznia. Dlaczego?
Niestety nie mogę doszukać się tego w żadnej specyfikacji - może ktoś znajdzie i przekona mnie, że tak powinno to działać - ale w przypadku Opery zdefiniowanie roku resetuje wcześniejsze zdefiniowanie miesiąca. By obejść "błąd" należy zacząć definicje od "najstarszej" informacji - czyli odpowiednio setYear(); setMonth(); setDate();
Komentarze
Komentarz użytkownika jam łasica
14 04 2010setFullYear powinno działać...
Komentarz użytkownika BTM
14 04 2010W rzeczy samej działa poprawnie. Co nie zmienia faktu, że w innych przeglądarkach zapis z setDate działa poprawnie zaś w Operze szaleje. Zakładam, że miało to usprawnić rozróżnianie 2010 i 1910. Wpis i tak pozostaje, dla potomnych grzebiących w starych skryptach ;-)
Komentarz użytkownika zeus
14 04 2010W specyfikacji pod adresem http://www.w3schools.com/jsref/jsrefobjdate.asp wyraźnie jest zaznaczone że należy używać setFullYear()
Komentarz użytkownika BTM
14 04 2010Taaak, jest, ale nie jest napisane dlaczego. Poza tym, jest to rozwiązanie nowsze niż część skryptów, które w innych przeglądarkach (i starszych Operach) działają poprawnie.
Komentarz użytkownika Arni
14 04 2010No cóż, widocznie Opera na siłe stara się dążyć do standardu, nawet kosztem utracenia wstecznej kompatybilności. Może to i brutalne, ale dobre.
Komentarz użytkownika pecet
14 04 2010Arni -- nie tylko do kompatybilności co do debilności, no ale fanboje Opery tego nie rozumieją ;)
Komentarz użytkownika Arni
14 04 2010@pecet, myślałem że cała sprawa IE pokazała wszystkim dość dobrze, co się dzieje kiedy producent sam sobie wyznacza standardy... widać nie do końca.
Naprawde lepiej będzie, jeśli wszyscy zaczną się trzymać W3C.
Btw, domyślam się o co Ci chodzi, ale zamieniając "kompatybilności" na "debilności" w mojej wypowiedzi, skonstruowałbyś dość dziwaczną... "wsteczną debilność". ;)
Komentarz użytkownika mina86
14 04 2010Zgłoś błąd i nie marudź.
Komentarz użytkownika Piotrek Reinmar Koszuliński
14 04 2010A ja nie wiem nad czym się głowicie. Nie ma setYear w specyfikacji, więc może sobie działać jak chce. Nie ma podstaw by uznawać to za błąd.
https://developer.mozilla.org/index.php?title=Pl/Dokumentacjaj%C4%99zykaJavaScript_1.5/Obiekty/Date/SetYear
Było w JS 1.0
Nie ma w JS 1.3
Komentarz użytkownika mina86
14 04 2010Jest błąd, bo w 10.10 działa inaczej.
Komentarz użytkownika Piotrek Reinmar Koszuliński
14 04 2010A w mojej przeglądarce działa jeszcze inaczej, więc w ogóle wszystkie przeglądarki się mylą. Nie ma standardu, nie ma błędu.
Komentarz użytkownika mina86
15 04 2010Nie twierdzę, że jest błąd względem standardu -- twierdze, że jest nieuzasadniona nieciągłość względem wersji przeglądarki. Zresztą moim zdaniem ten kod powinien generować kwiecień 3910.
Komentarz użytkownika BTM
15 04 2010@Piotrek: i tu się mylisz. Nie ma w JS 1.5, ale jest w JS 1.4, zostało oznaczone jako przestarzałe w JS1.3, co nie oznacza, że duża część starych skryptów / FAQ wciąż wskazuje jako właściwą. I wg. specyfikacji jest opisana jako:
setYear(yearValue)
If yearValue is a number between 0 and 99 (inclusive), then the year for dateObjectName is set to 1900 + yearValue. Otherwise, the year for dateObjectName is set to yearValue.
Co jak widać Opera sobie radośnie zignorowała, przez co kompatybilność wsteczna kuleje.
Komentarz użytkownika BTM
15 04 2010Damn, nawet w JS 1.5 wciąż jest.