2016-03-04 6 views
1

У меня есть следующий фрагмент кода (на самом деле я использую new Date(), чтобы получить сегодня (4 марта 2016 года), но это не будет Мартом навсегда, поэтому, чтобы быть разумным тестом, я сделал дата явно.Обозначает ли Javascript лет

var n = new Date(2016,2,4); 
var d = new Date (
    n.getFullYear(), 
    n.getMonth(), 
    -1, 
    6,0,0); 
console.log(d.toString()); 

когда п теперь (за исключением это не так) и d является новая дата, которую я хочу быть в последний день предыдущего месяца. Я не получаю 29 февраля 2016 6:00 утра UTC, что я и ожидал, вместо этого я получаю 28 февраля.

Это дает тот же результат как в Chrome, так и в Iceweasel (Firefox). Как мне найти последний день в прошлом месяце (особенно в этом году, когда это високосный год)

Если это имеет значение, я нахожусь в часовом поясе GMT.

ответ

4

Это потому, что дни основаны на 1, а не на 0.

var march4 = new Date(2016, 2, 4); 
var feb29 = new Date(
    march4.getFullYear(), 
    march4.getMonth(), 
    0); // <-- go to the day before the first of the given month 
console.log(feb29); // Mon Feb 29 2016 00:00:00 GMT-0700 (Mountain Standard Time) 

Для справки, если вы будете использовать тот же трюк в период с апреля по март, вы получите 31 марта.

var april = new Date(2016, 3, 4); 
var march = new Date(
    april.getFullYear(), 
    april.getMonth(), 
    0); 
console.log(march); // Thu Mar 31 2016 06:00:00 GMT-0600 (Mountain Daylight Time) 
1

На самом деле, она признает

Если вы попробуете это, он работает: Date (2016, 2, 0);

Это приносит мне Mon Feb 29 2016 00:00:00 GMT-0300

Вместо -1, попробуйте 0:

var n = new Date(2016,2,1); 
var d = new Date (
      n.getFullYear(), 
      n.getMonth(), 
      0, 
      6,0,0); 
console.log(d.toString());