Создание даты с номерами (новая дата (2012, 03,...) дает неправильный месяц (+1)

При создании объекта new Date с использованием чисел для частей значение, которое я возвращаю, в точности один месяц превышает значение, которое я вложил в "месяц".

new Date(2012, 05, 17, 00, 00, 00)
Sun Jun 17 2012 00:00:00 GMT+0800 (HKT)  // june?!

Однако обычный разбор точно такой же строки возвращает правильное время:

new Date("2012-05-17 00:00:00")
Thu May 17 2012 00:00:00 GMT+0800 (HKT)

Я получаю тот же результат в ie/ff/chrome. Удаление часов/мин/сек не оказывает никакого эффекта. Я могу обойти это, вычитая один перед установкой месяца, но вместо этого я просто переключился на запись моей даты в виде строки.

Edit: Разбор строк не работает в IE. Я понятия не имею, что я сделал, но я клянусь, что сделал эту работу. Это вопрос. почему я избегал этого в первую очередь. Я переключился на использование moment.js на данный момент.

А, теперь я понял. Точно так же, как обычные даты java, которые я не кодирую, кроме редко, и даже тогда всегда с библиотекой (joda и т.д.). Какая ужасная идея в любом случае. Вот, например, skeets задают вопрос: Почему январь месяц 0 в Java-календаре?

Почему это происходит?

Ответ 1

Программисты начинают отсчет с 0. Таким образом, месяцы представлены 0 (Jan) -11 (Dec).

Причина, по которой дни не следуют этому правилу, заключается в том, чтобы не путать авторов с разницей 30/31 месяца.

Из MDN:

месяц

Целочисленное значение, представляющее месяц, начиная с 0 для января до 11 декабря.