日期调整函数异常求助:部分月份输出日期少一天
问题根源
你的代码核心问题是混合使用UTC日期方法和本地时区的Date构造函数,时区不一致导致夏令时生效月份出现日期偏移:
- 你用
getUTCDate()获取的是日期的UTC时区日数,但逻辑里要判断的应该是本地时区的5日/20日(毕竟输入的date1大概率是本地时间)。 - 后续创建新日期
new Date(year, month, day)是基于本地时区生成的,夏令时生效月份(比如多数地区的3-10月)本地与UTC的偏移量会变化,写入Sheet时,Sheet的日期存储/显示逻辑会把本地时间转成UTC,最终导致日期少一天。
举个实际场景:假设你在UTC+2(夏令时)时区,本地时间5日0点对应的UTC时间是前一天的22点,用本地构造函数生成当月20日0点,写入Sheet后会被转成UTC的19日22点,Sheet显示出来就是19日——这就是你看到的日期少一天的原因。而1、2、11、12月是冬令时,偏移量稳定,所以没出问题。
修复方案
统一时区处理,二选一即可:
方案1:全程用本地时区
把getUTCDate()换成getDate(),确保判断和创建日期都基于本地时区:
if (date1 instanceof Date){ var day = date1.getDate(); // 改为本地日期方法 var month = date1.getMonth(); var year = date1.getFullYear() if (day === 5){ date1 = new Date(year, month, 20) } else if (day === 20){ date1 = new Date(year, month+1, 5) } sheet.getRange("V3").setValue(date1) }
方案2:全程用UTC时区
如果date1是UTC时间,创建新日期时用Date.UTC()构造:
if (date1 instanceof Date){ var day = date1.getUTCDate(); var month = date1.getUTCMonth(); var year = date1.getUTCFullYear() if (day === 5){ date1 = new Date(Date.UTC(year, month, 20)) // 用UTC构造函数 } else if (day === 20){ date1 = new Date(Date.UTC(year, month+1, 5)) } sheet.getRange("V3").setValue(date1) }
这样就能彻底解决夏令时导致的日期偏移问题,因为全程用同一时区的处理逻辑,不会出现转换偏差。
内容的提问来源于stack exchange,提问作者Brodieman
相关产品推荐
相关产品推荐

