(new Date('2012-12-01')).getMonth()
10
вместо 11
(getMonth
является 0-индексированным). Я тестировал Firefox, Chrome и Node.js. Почему это происходит?
(новая дата ('2012-12-01')). getMonth() === 10?
Ответ 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, …))
.
Ответ 2
Для Случай Firefox, по крайней мере, RFC2822 указывает, что спецификации даты должны быть разделены Складывание белого пространства, Попробуйте (new Date('2012 12 01')).getMonth();
Использование -
в качестве разделителя, по-видимому, не определено.
Ответ 3
Ошибка возникает из-за префикса дня 01 с 0. Не уверен, ПОЧЕМУ это, но если вы удалите нуль перед 1, он даст вам правильный месяц (11).
Кроме того, он начинает давать неправильный месяц в октябре, если это что-то значит.
Краткосрочное исправить, используйте 1 вместо 01.