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

日期调整函数异常求助:部分月份输出日期少一天

问题根源

你的代码核心问题是混合使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:19:53