(новая дата ('2012-12-01')). getMonth() === 10?

(new Date('2012-12-01')).getMonth() 10 вместо 11 (getMonth является 0-индексированным). Я тестировал Firefox, Chrome и Node.js. Почему это происходит?

Ответ 1

У вас возникает проблема с часовым поясом. Ваш JS-движок интерпретирует строку как UTC, так как она больше не указана. Из спецификации Date.parse (который используется new Date):

Строка может быть интерпретирована как локальное время, время UTC или время в каком-либо другом часовом поясе, в зависимости от содержимого строки. Сначала функция пытается проанализировать формат строки в соответствии с правилами, выписанными в формате строки времени даты (15.9.1.15). Если String не соответствует этому формату, функция может вернуться к любой эвристике, специфичной для конкретной реализации, или к форматам дат реализации.

В вашем часовом поясе дата-время Nov 30 2012 19:00:00 GMT-0500 - в ноябре. Используйте .getUTCMonth(), и вы получите декабрь. Однако никогда не доверяйте Date.parse, каждый браузер делает это по-другому. Поэтому, если вы не находитесь в ограниченных средах, таких как Node.js, вы всегда должны анализировать свою строку (например, с помощью регулярного выражения) и передавать ее на new Date(Date.UTC(year, month, date, …)).

Ответ 3

Ошибка возникает из-за префикса дня 01 с 0. Не уверен, ПОЧЕМУ это, но если вы удалите нуль перед 1, он даст вам правильный месяц (11).

Кроме того, он начинает давать неправильный месяц в октябре, если это что-то значит.

Краткосрочное исправить, используйте 1 вместо 01.