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

Javascript 为什么.setUTCFullYear()和.setUTCMonth()返回不同的结果,javascript,google-apps-script,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

在此示例代码中,要将字符串转换为日期,请执行以下操作:

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”。其他一些值返回的结果同样糟糕。为什么“setUTCMonth”的结果与“setUTCFullYear”的结果不同?

将日期设置在月份之前

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

如果指定的参数超出预期范围, setUTCMonth()尝试更新日期中的日期信息 反对。例如,如果您使用15表示monthValue,则 年份将增加1,3将用于月份

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

因此:

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

有些月份没有31号日期,因此31号超出了日期范围,因此会相应更新

因此,如果您尝试设置月份,例如二月,而不首先更改日期, 日期将为2015年2月31日,但今年2月只有28天,因此将延至2015年3月3日

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

因此,请先更改日期,如上面所示,或者在创建时设置默认日期:

new Date("01/01/2015")

首先设置UTCDate,然后设置UTCMONTH,但为什么要解决这个问题?我不明白为什么你要在月的前一天定下来。这似乎是武断的。让我吃惊的是,如果我没有在本月31日进行测试,我怎么也不会注意到这一点,而且这一点很容易会在数年内未被报告/未被注意到,即使它已被报告,除非它碰巧在本月最后一天进行测试,否则将无法生产。。。