Почему Javascript по-разному относится к дням и месяцам?

42

Я заметил, что в JavaScript при создании Date, месяцы основаны на нуле, а дни - нет.

Например:

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

производит 1 февраля 2012

Почему это?

surfitscrollit
источник
6
months = ['Jan', 'Feb',..., 'Nov', 'Dec']; month = months[date.getMonth()];
zzzzBov

Ответы:

50

Скорее всего, идея заключается в том, что месяцы считаются индексом в массиве названий месяцев, а дни просто «считаются».

Торстен Мюллер
источник
21
Там, где это имеет смысл с точки зрения ответа, просто глупо думать, что эта логика существует уже давно, и я никогда не сомневался в этом раньше.
rlemon
2
@rlemon Тот факт, что вы никогда не подвергали сомнению эту логику, доказывает, что она имеет смысл :)
dasblinkenlight
14
FWIW, я никогда не думал, что это имеет много смысла. Обработка дат в JavaScript всегда вызывала у меня дрожь, потому что я обычно забывал такие вещи, пока не начал отлаживать странные результаты.
FrustratedWithFormsDesigner
2
FWIW, я не являюсь разработчиком внешнего интерфейса, и мне не часто приходится иметь дело с датами в Javascript, кроме случайныхnew Date().getTime()
rlemon
20
Когда дело доходит до Javascript, «вот почему они это сделали» и «это имеет смысл» - это две вещи, которые вы редко слышите вместе.
Тридус
14

Может также случиться так, что даты Javascript предназначались для имитации дат java. Java также использовала нулевой месяц с начала.

JDK API v1.0.2: Date.getMonth ()

Дэнни Кирхмайер
источник
6
И спецификация Java отражает структуру C tm. См. Также stackoverflow.com/questions/344380/…
35
Это не значит, что Java Date API - ужасно хороший пример хорошего дизайна ;-)
Joachim Sauer