Пятнадцатого февраля не найдено

Я нахожусь в 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) был бы без эффекта)