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

HDC*_*rus 2 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);
}
Run Code Online (Sandbox Code Playgroud)

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

但是,这个几乎相同的功能:

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);
}
Run Code Online (Sandbox Code Playgroud)

返回“2015 年 7 月 1 日星期三 20:10:04 GMT+01:00”。其他一些值返回同样糟糕的结果。为什么“setUTCMonth”和“setUTCFullYear”得到不同的结果?

Pat*_*ans 6

在月份之前设置日期

date.setUTCFullYear(input[0]);
date.setUTCDate(input[2]);
date.setUTCMonth(input[1] - 1);
Run Code Online (Sandbox Code Playgroud)

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

如果您指定的参数超出预期范围,则 setUTCMonth() 会相应地尝试更新 Date 对象中的日期信息。例如,如果您将 15 用于月份值,则年份将增加 1,月份将使用 3。

每个 UTC 函数都有关于超出范围值的类似说明。

所以因为这个:

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

有些月份没有 31 号日期,因此 31 号不在日期范围内,因此会相应地更新。

因此,如果您尝试将月份设置为 2 月而不先更改日期,则日期将为 2/31/2015,但 2 月今年只有 28 天,因此它会滚动到 3/03/2015

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

因此,首先像我上面显示的那样更改日期,或者在创建它时设置默认日期:

new Date("01/01/2015")
Run Code Online (Sandbox Code Playgroud)