setDate()意外地累积了几天

时间:2016-08-08 06:09:41

标签: javascript google-apps-script

使用Google表格。我试图在工作表中更改日期的两周范围内检查数据条目。所以我需要一个可变日期,从输入日期开始设置为1,2,3 ...... 14天。

var startFortnightDate = ss.getSheetByName('FortnightValidation').getRange('C3').setValue("=to_date("+e.value+")").getValue();
var variableDate = startFortnightDate;
//Loop start
for (var dayCount = 1; dayCount < 8; dayCount++) {//each day of the week
  for (var weekCount = 0; weekCount < 2; weekCount++) {//each week of the fortnight
variableDate = startFortnightDate;//this is to reset the date to allow setting of the date to variable number of days forward
variableDate.setDate(variableDate.getDate() + (dayCount + (7*weekCount)));//This changes the date and accumulates if it isn't reset????
Logger.log("Line 197. variableDate = " + variableDate);
Logger.log("Line 199 " + startFortnightDate);
}
}
//Loop end

由于我无法理解的原因,似乎fortnightStartDate正在累积以及variableDate,即使我正在重置每个循环。是否将startFortnightDate的值分配给variableDate?

部分日志如下:

[16-08-08 16:01:43:609 AEST] Line 199 Mon Feb 13 2389 00:00:00 GMT+1100 (AEDT)
[16-08-08 16:01:43:609 AEST] Line 197. variableDate = Mon Feb 27 2389 00:00:00 GMT+1100 (AEDT)
[16-08-08 16:01:43:610 AEST] Line 199 Mon Feb 27 2389 00:00:00 GMT+1100 (AEDT)
[16-08-08 16:01:43:610 AEST] Line 197. variableDate = Tue Feb 28 2389 00:00:00 GMT+1100 (AEDT)
[16-08-08 16:01:43:611 AEST] Line 199 Tue Feb 28 2389 00:00:00 GMT+1100 (AEDT)
[16-08-08 16:01:43:611 AEST] Line 197. variableDate = Wed Mar 08 2389 00:00:00 GMT+1000 (AEST)
[16-08-08 16:01:43:611 AEST] Line 199 Wed Mar 08 2389 00:00:00 GMT+1000 (AEST)
[16-08-08 16:01:43:612 AEST] Line 197. variableDate = Fri Mar 10 2389 00:00:00 GMT+1000 

2 个答案:

答案 0 :(得分:2)

你可能有一个指针问题,但我不确定。这对我有用:

var startFortnightDate = ss.getSheetByName('FortnightValidation').getRange('C3').setValue("=to_date("+e.value+")").getValue(); 
  //var startFortnightDate = new Date();  // Used for testing since I don't have your spreadsheet
  startFortnightDate = Date.parse(startFortnightDate); // Convert date object to milliseconds 
  var variableDate = startFortnightDate;
  var inc = 24*60*60*1000;               // One day in milliseconds
  for (var weekCount = 0; weekCount<2; weekCount++){
    for (var dayCount = 1; dayCount<8; dayCount++){
      variableDate += inc;              // Add one day
      Logger.log('startFortnightDate = %s',new Date(startFortnightDate))
      Logger.log('variableDate = %s',new Date(variableDate))
    }
  }

你会注意到我改变了循环的顺序。你的方式,你增加两周,然后增加一天,而不是增加一天两个星期。

我还使用Date.parse(dateObject)转换为毫秒来简化它,这对我来说是一种操作日期的简单方法。然后在每个循环上variableDate增加一天,但startFortnightDate保持原样。要显示,请使用new Date(milliseconds)转换回日期对象。 w3schools对日期对象的参考是非常彻底的,并且帮助了我很多次:

http://www.w3schools.com/jsref/jsref_obj_date.asp

以下是我的日志的一部分:

[16-08-08 03:00:08:361 EDT] startFortnightDate = Mon Aug 08 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:362 EDT] variableDate = Tue Aug 09 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:363 EDT] startFortnightDate = Mon Aug 08 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:363 EDT] variableDate = Wed Aug 10 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:364 EDT] startFortnightDate = Mon Aug 08 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:365 EDT] variableDate = Thu Aug 11 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:365 EDT] startFortnightDate = Mon Aug 08 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:366 EDT] variableDate = Fri Aug 12 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:367 EDT] startFortnightDate = Mon Aug 08 03:00:08 GMT-04:00 2016
[16-08-08 03:00:08:367 EDT] variableDate = Sat Aug 13 03:00:08 GMT-04:00 2016

答案 1 :(得分:1)

而不是

var variableDate = startFortnightDate;

应该是

var variableDate = new Date(startFortnightDate);

这将解决问题。