2012-03-13 11 views
13

To spowodowało mi trochę bólu głowy ostatniej nocy i chciałem zrozumieć, dlaczego metoda getDate w obiekcie Date jest 1 (zwraca wartości od 1-31), podczas gdy metoda getMonth jest 0 w oparciu (zwraca 0-11). Zastanawiam się, dlaczego istnieje ta niekonsekwencja w metodach dla tego samego obiektu.JavaScript Data metoda niespójność - getDate vs getMonth

Rozumiem, dlaczego obecnie trudno jest zmienić to zachowanie, ale czy są jakieś powody, dla których został zaprojektowany w ten sposób?

dokumentację można znaleźć tutaj: http://www.w3schools.com/jsref/jsref_obj_date.asp

+1

pokrewne: http://stackoverflow.com/questions/834757/why-does-getday-return-incorrect-values-javascript/834807#834807 – Guffa

+0

Rzuć mu tweet i poprosić go, Bardzo chciałbym usłyszeć jego odpowiedź, to też mnie zaskoczyło! http://twitter.com/#!/brendaneich (ps gdy mówię "on" mam na myśli twórcę) – Magrangs

+0

rel: http://stackoverflow.com/questions/1453043/zero-based-month-numbering – georg

Odpowiedz

14

Przypuszczam miesięcy wynoszą 0 opartej ponieważ Java did it the same way kiedy zaprojektowano język JavaScript.

EDIT Oracle wyłączył starszą dokumentację Java, jest tam an archived version of that page.

+1

Domyślam się, że moje pytanie zmienia się w to, dlaczego zostało to zaimplementowane w Javie? –

+0

@DanGoldin: Spodziewałem się tej odpowiedzi. I mogłem tylko zgadywać: ponieważ zdecydowali, że byłoby mylące zwracanie '12' z' getDate() ', gdy bieżąca data to' 13'. Zdecydowali również, że 'for (m = 0; m <12; m ++)' będzie wyglądać ładniej niż 'for (m = 1; m <13; m ++)'. Czy coś takiego. – Tomalak

+4

@ Tomalak: Wygląda na to, że masz rację, opierając się na odpowiedzi Brendana Eicha - https://twitter.com/#!/BrendanEich/status/179638412775661572 –

4

W JavaScript, liczniki zaczynają się od zera.

Miesiące niekoniecznie muszą być reprezentowane przez cyfrę. "Miesiące" to policzalna sekwencja. Pierwszy element tej sekwencji jest określony jako zero.

W rzeczywistości, dni są reprezentowane przez ustaloną cyfrę. Chociaż dni są również policzalne, byłoby bardzo mylące, aby reprezentować pierwszy dzień jako Dzień Zero.

+2

* "Miesiące niekoniecznie muszą zaczynać się od 1" * - To stwierdzenie, które trudno mi zrozumieć. – Tomalak

+0

@ Tomalak Przez to rozumiem, że miesiące mogą być reprezentowane przez "styczeń" itd. Nie mogę wymyślić żadnej innej metody reprezentującej dni miesiąca. Z drugiej strony dni tygodnia mogą być również reprezentowane przez "niedzielę" itd. Zaczyna się także liczenie od zera. –

+0

Ale w rzeczywistości, miesiące są również reprezentowane przez stałą cyfrę. –

6

Trudno powiedzieć, ale mam podejrzenia, że ​​miesiąc jest 0 oparte dzięki czemu może być łatwo wykorzystane jako indekser w miesięczną tablicy, która przechowuje nazwy miesięcy

var months = new ["Jan", "Feb", ....] 
months[new Date().getMonth()]; 
+1

To jest całkiem interesujące wyjaśnienie - dzięki! Nadal uważam, że to zły projekt, aby zaimplementować go na 0, ponieważ podejrzewasz, że ludzie chcieliby go zmapować do tablicy. Myślę, że lepiej byłoby zachować 1, a potem pozwolić użytkownikom na odjęcie 1, jeśli chcą je zindeksować w tablicy. –

+0

Nie mówię, że to dobry projekt - po prostu uważam, że * może * był powodem. –

+1

Daty mogą równie dobrze być! 'var dates = [1,2,3 ... 31]' – jjt

21

Więc rzuciłem Brendan Eich tweet prosząc pytanie (dla tych, którzy nie wiedzą, że jest twórcą JS) i jego odpowiedź była:

@magrangs bo to jest jak java.util .Date to zrobił.

https://twitter.com/BrendanEich/status/179610205317902337

+3

OK, nowe pytanie: dlaczego Java zrobiła to w ten sposób? ("Bo tak właśnie zrobił C!" ... OK, dlaczego C zrobił to w ten sposób? ... ???) – Noyo

+1

@Noyo Ponieważ użycie licznika opartego na zera umożliwia indeksowanie do tablicy. http://stackoverflow.com/questions/9687521/9687586#9687586 – Tomalak