Пятнадцатое февраля не найдено - PullRequest
11 голосов
/ 31 октября 2008

Я в 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)"

Почему это происходит? Похоже, ошибка браузера.

Ответы [ 5 ]

30 голосов
/ 31 октября 2008

Это потому, что когда вы инициализируете новую дату, она идет с сегодняшней датой, поэтому сегодня 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 ]);
27 голосов
/ 31 октября 2008

Вероятно, лучше всего создать объект Date за один шаг, чтобы избежать того, чтобы объект Date находился в неоднозначном или недопустимом состоянии:

d = new Date(2009, 1, 15);
1 голос
/ 31 октября 2008
d = new Date();
d.setDate(15);                    
d.setMonth(1);
d.setFullYear(2009);                                                                 
d.toString();

Это работает.

0 голосов
/ 02 февраля 2012

Обычно это работает, чтобы избежать поведения при опрокидывании 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) будет безрезультатным)
0 голосов
/ 31 октября 2008

После нескольких испытаний в FF3 на XP с Firebug, вот что я могу вам сказать

  • Вызов Date.setDate () после вызов Date.setMonth () сгенерирует это странное поведение.
  • Date.setMonth () заставляет часовой пояс быть CST (или некоторой зоной без DST)
  • Date.setDate () заставляет часовой пояс быть CDT (или некоторой зоной, поддерживающей DST)

Итак, с setMonth () и setDate () определенно происходит нечто странное в отношении часового пояса.

Единственное решение, которое я могу предложить, заключается в следующем: установите дату, прежде чем установить месяц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...