Dlaczego JavaScript traktuje dni i miesiące inaczej?

42

Zauważyłem, że w JavaScript, podczas tworzenia Date, miesiące są zerowe, a dni nie.

Na przykład:

var foo = new Date(2012, 1, 1)

produkuje 1 lutego 2012 r

Dlaczego to?

surfitscrollit
źródło
6
months = ['Jan', 'Feb',..., 'Nov', 'Dec']; month = months[date.getMonth()];
zzzzBov

Odpowiedzi:

50

Najprawdopodobniej chodzi o to, że miesiące są traktowane jako indeks w tablicy nazw miesięcy, podczas gdy dni są po prostu „liczone”.

Thorsten Müller
źródło
21
Tam, gdzie ma to sens z punktu widzenia odpowiedzi, szaleństwem nietoperzy jest myśleć, że ta logika istnieje od jak dawna i nigdy wcześniej jej nie kwestionowałem.
rlemon
2
@rlemon Fakt, że nigdy wcześniej nie kwestionowałeś tej logiki, tylko dowodzi, że ma ona sens :)
dasblinkenlight,
14
FWIW, nigdy nie myślałem, że to ma sens. Przetwarzanie dat w JavaScript zawsze sprawiało, że wzdrygałem się, ponieważ zwykle zapominałem o takich rzeczach, dopóki nie zacząłem debugować dziwnych wyników.
FrustratedWithFormsDesigner
2
FWIW, nie jestem front-endowym deweloperem i nie muszę często zajmować się datami w Javascript oprócz okazjonalnychnew Date().getTime()
rlemon
20
Jeśli chodzi o JavaScript, „dlatego to zrobili” i „to ma sens” to dwie rzeczy, które rzadko słyszy się razem.
Tridus
14

Możliwe też, że daty Javascript miały naśladować daty Java. Java od samego początku używała zerowego miesiąca.

JDK API v1.0.2: Date.getMonth ()

Danny Kirchmeier
źródło
6
A java spec odzwierciedla strukturę C tm. Zobacz także stackoverflow.com/questions/344380/…
35
Nie oznacza to, że Java Date API jest strasznie dobrym przykładem dobrego projektu ;-)
Joachim Sauer,