Пятнадцатого февраля не найдено
Я нахожусь в javascript, запуская его в консоли
d = new Date();
d.setMonth(1);
d.setFullYear(2009);
d.setDate(15);
d.toString();
выводит это:
"Sun Mar 15 2009 18:05:46 GMT-0400 (EDT)"
Зачем это происходит? Это похоже на ошибку браузера.
Ответы
Ответ 1
Это потому, что когда вы инициализируете новую дату, она поставляется с сегодняшней датой, поэтому сегодня 30 октября 2008 года, тогда вы установите месяц до февраля, так что нет 30 февраля, поэтому установите сначала день, затем месяц, а затем год:
d = new Date();
d.setDate(15);
d.setMonth(1);
d.setFullYear(2009);
Но как @Jason W, лучше использовать конструктор Date:
new Date(year, month, date [, hour, minute, second, millisecond ]);
Ответ 2
Вероятно, лучше всего построить объект Date за один шаг, чтобы избежать того, что объект Date находится в неопределенном или недействительном состоянии:
d = new Date(2009, 1, 15);
Ответ 3
d = new Date();
d.setDate(15);
d.setMonth(1);
d.setFullYear(2009);
d.toString();
Это работает.
Ответ 4
После кучи тестирования в FF3 на XP с Firebug, вот что я могу вам сказать.
- Вызов Date.setDate() после вызова Date.setMonth() генерирует это нечетное поведение.
- Date.setMonth() заставляет часовой пояс быть CST (или, в некоторой зоне, не поддерживающей DST)
- Date.setDate() заставляет часовой пояс быть CDT (или некоторой зоной, поддерживающей DST)
Итак, определенно что-то неуловимое происходит с setMonth() и setDate() в отношении часового пояса.
Единственное решение, которое я могу предложить, следующее: Установите дату до того, как вы установите месяц.
Ответ 5
Это будет работать в целом, чтобы избежать поведения опрокидывания API-интерфейсов javascript:
d.setDate(1);
d.setFullYear(year);
d.setMonth(month);
d.setDate(day);
Учитывая, что год + месяц + день находятся в "действительной" комбинации, например. взятый из другого объекта Date с использованием getFullYear(), getMonth(), getDate().
Важными частями являются:
- начиная с
setDate(1)
, чтобы избежать возможного опрокидывания, когда текущее значение даты равно 29, 30 или 31
- вызов
setMonth(month)
до setDate(day)
, чтобы избежать такого же опрокидывания в случае, если текущее значение месяца является "проблематичным" (потому что тогда начальный setDate(1)
был бы без эффекта)