JS Date Object setUTCMonth()两个月增加?

时间:2015-03-20 16:49:05

标签: javascript date

我有非常奇怪的情况,我使用setUTCMonth()方法为日期对象设置UTC月值。但它增加了两倍。

我的书面代码在控制台的开始和结束日输出。

// user input 

var start_month = 1;
var start_year = 2013;

var end_month = 6;
var end_year = 2013;

// code

start_month = start_month - 1;
end_month = end_month - 1;

var start_date = new Date();
start_date.setFullYear(start_year);
start_date.setUTCMonth(start_month);

var end_date = new Date(end_year, end_month);
end_date.setFullYear(end_year);
end_date.setUTCMonth(end_month);

console.log('<< START >>');
start_end_log(start_date, end_date);

function start_end_log(start_date, end_date){
    
     if(start_date.getFullYear() == end_date.getFullYear() 
        && start_date.getUTCMonth() == end_date.getUTCMonth()
       ){
         console.log('<< THE END >>');
         return;
     }
    
    start_date.setUTCDate(1); // go back to frist day of the month
    var start_date_str = start_date.toISOString().substr(0, 10); // get first day
    start_date.setUTCMonth(start_date.getUTCMonth() + 1); // increase to next month
    start_date.setUTCDate(0); // go back to last day of last month
    var end_date_str  = start_date.toISOString().substr(0, 10); // get last day

    console.log('start date: ' + start_date_str + ' End date: ' + end_date_str);
    
    var month = start_date.getUTCMonth();
    console.log('current month ' + month);
    
    month++;
    console.log('after increment month ' + month);
    
    start_date.setUTCMonth(month); // go to next month
    console.log('Check after setting month ' + start_date.getUTCMonth()); // why it is increasing by 2? :(
    
    start_end_log(start_date, end_date);
    
}

JS小提琴http://jsfiddle.net/jhg7ddjh/

我在控制台上设置之后输出月份编号。我不明白它是如何增加两倍的。

解决

在致电getUTCMonth()之前,需要将日期设置回下个月可用的日期。

已更改

start_date.setUTCMonth(month); // go to next month

start_date.setUTCDate(1);
start_date.setUTCMonth(month); // go to next month

1 个答案:

答案 0 :(得分:2)

这一行:

start_date.setUTCDate(0);  // go back to last day of last month

...表示start_date将在一个月的最后一天。在您的示例中,该月份是1月,其中包含31天,因此现在start_date位于31/01/2015上(尽管start_date_str"01/01/2015",并且您使用start_date_str } {而非start_date,在console.log语句中,读取输出相当混乱。

然后你做

var month = start_date.getUTCMonth();
console.log('current month ' + month);

month++;
console.log('after increment month ' + month);

...在月份值为31的日期将月份设置为1(2月),给你(理论上)31/02/2015 - 你看到了问题,2月份没有31天

JavaScript日期非常明智,因此会将其调整为03/03/2015(3月,2月),因此当您拨打getUTCMonth时,您将返回2而不是1。