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)
关键修正点
var d_date = new Date(lastday);:以目标旧日期为基准创建新的Date实例,确保计算起点正确。d_date.setDate(d_date.getDate() + i);:在新实例上累加天数,setDate()会自动处理月份、年份的进位(例如12月31日加1天会自动转为次年1月1日)。
内容的提问来源于stack exchange,提问作者Diarox Carbon
相关产品推荐
相关产品推荐

