为什么.setUTCFullYear()和.setUTCMonth()会返回不同的结果

时间:2015-05-31 19:11:15

标签: javascript google-apps-script

在此示例代码中,将字符串转换为日期:

function stringToDate(){
  var edate = "2015-06-01";
  Logger.log(edate);
  var input = edate.split('-'); 
  var date = new Date();
  date.setUTCFullYear(input[0],input[1] - 1,input[2]);
  Logger.log(date);
}

记录日期返回“Mon Jun 01 20:07:45 GMT + 01:00 2015”,这是正确的,因为月份'06' - 1 = 5对应于6月份。

然而,这几乎是相同的功能:

function stringToDate2(){
  var edate = "2015-06-01";
  Logger.log(edate);
  var input = edate.split('-');  
  var date = new Date(); 
  date.setUTCFullYear(input[0]);
  date.setUTCMonth(input[1] - 1);
  date.setUTCDate(input[2]);
  Logger.log(date);
}

返回“Wed Jul 01 20:10:04 GMT + 01:00 2015”。其他一些值会返回同样棘手的结果。为什么我为'setUTCMullYear'获得'setUTCMonth'的不同结果?

1 个答案:

答案 0 :(得分:3)

设置月份前的日期

date.setUTCFullYear(input[0]);
date.setUTCDate(input[2]);
date.setUTCMonth(input[1] - 1);
  

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMonth

     

如果您指定的参数超出预期范围,   setUTCMonth()尝试更新日期中的日期信息   相应的对象。例如,如果你使用15作为monthValue,那么   year将增加1,而3将用于月份。

每个UTC函数都有一个关于超出范围值的类似注释。

因此:

new Date()获取当前日期,因此今天 5/31 日期 31

有几个月没有第31个日期,因此31超出了日期范围,因此会相应更新。

因此,如果您尝试设置二月份的月份而不先更改日期, 该日期将是2015年2月31日,但今年2月只有28天,所以它将翻到2015年3月3日

在您的情况下,如果您尝试将其设置为6月,2015年6月31日,则6月永远不会有第31个日期,所以它再次滚动到2015年7月1日。等等。

首先像我上面所示更改日期,或者在创建时设置默认日期:

new Date("01/01/2015")