You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script日期运算异常:旧日期加天数得到当前年份日期

问题排查:基于旧日期生成连续日期时年份异常

问题描述

在Google Apps Script中编写代码,意图基于旧日期(Thu Dec 31 11:00:00 GMT-05:00 2009,对应GMT+8的2010-01-01)循环添加天数生成连续日期。预期2010-01-01加1天得到2010-01-02,但实际日志显示结果为2022-09-02,需排查解决。

原代码片段

var lastrow = SS.getLastRow()
var lastday = SS.getRange("A"+ lastrow).getValue(); //Thu Dec 31 11:00:00 GMT-05:00 2009 = 2010-01-01 (GMT +8)
var today = SS.getRange("C2").getValue();
var diffInDays = Math.floor((today-lastday)/(24*3600*1000));

//Creat DateAr |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.log(diffInDays)
var AddingAr =[]
for (var i = 1; i < diffInDays ; i = i + 1) {

  var d_date = new Date();
  d_date = d_date.setDate(lastday.getDate()+ i )
  var d_dateString = Utilities.formatDate( new Date(d_date) , "GMT+8", "yyyy-MM-dd")
  AddingAr.push([d_dateString])
  Logger.log("lastday: "+ lastday+" +i:" +i + " =d_date: "+ d_date +" = " + d_dateString)

}

Logger.log(AddingAr)
Logger.log(AddingAr.length)
SS.getRange(lastrow + 1, 1,AddingAr.length).setValues(AddingAr)

日志信息

Log:

lastday: Thu Dec 31 2009 11:00:00 GMT-0500 (Eastern Standard Time) +i:1 =d_date: 1662023267434 = 2022-09-01
下午5:07:47   資訊  lastday: Thu Dec 31 2009 11:00:00 GMT-0500 (Eastern Standard Time) +i:2 =d_date: 1662109667441 = 2022-09-02
下午5:07:47   資訊  lastday: Thu Dec 31 2009 11:00:00 GMT-0500 (Eastern Standard Time) +i:3 =d_date: 1662196067443 = 2022-09-03
下午5:07:47   資訊  lastday: Thu Dec 31 2009 11:00:00 GMT-0500 (Eastern Standard Time) +i:4 =d_date: 1662282467445 = 2022-09-04
下午5:07:47   資訊  lastday: Thu Dec 31 2009 11:00:00 GMT-0500 (Eastern Standard Time) +i:5 =d_date: 1662368867447 = 2022-09-05

问题原因

  • 代码中var d_date = new Date()创建的是当前系统日期(2022年的日期),而非基于目标旧日期。
  • setDate()方法的作用是设置日期对象的当月日期数,而非在原日期基础上累加天数。传入lastday.getDate() + i(即31+i),相当于把当前年份的当月日期改成31+i号,自然得到2022年的日期。

修复方案

基于旧日期创建新的Date实例,在该实例上累加天数,而非修改当前日期。修正后的代码如下:

var lastrow = SS.getLastRow()
var lastday = SS.getRange("A"+ lastrow).getValue(); //Thu Dec 31 11:00:00 GMT-05:00 2009 = 2010-01-01 (GMT +8)
var today = SS.getRange("C2").getValue();
var diffInDays = Math.floor((today-lastday)/(24*3600*1000));

//Creat DateAr
Logger.log(diffInDays)
var AddingAr =[]
for (var i = 1; i < diffInDays ; i = i + 1) {
  // 基于旧日期创建新的Date对象,避免修改原日期
  var d_date = new Date(lastday);
  // 在新日期对象上累加i天,自动处理年月进位
  d_date.setDate(d_date.getDate() + i);
  var d_dateString = Utilities.formatDate(d_date, "GMT+8", "yyyy-MM-dd")
  AddingAr.push([d_dateString])
  Logger.log("lastday: "+ lastday+" +i:" +i + " =d_date: "+ d_date +" = " + d_dateString)
}

Logger.log(AddingAr)
Logger.log(AddingAr.length)
SS.getRange(lastrow + 1, 1,AddingAr.length).setValues(AddingAr)

关键修正点

  1. var d_date = new Date(lastday);:以目标旧日期为基准创建新的Date实例,确保计算起点正确。
  2. d_date.setDate(d_date.getDate() + i);:在新实例上累加天数,setDate()会自动处理月份、年份的进位(例如12月31日加1天会自动转为次年1月1日)。

内容的提问来源于stack exchange,提问作者Diarox Carbon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:25:09