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

Google Apps Script中Date对象提取日期子项异常问题

问题根因

你的代码存在4处核心错误,直接导致日期解析结果异常:

  • 使用了已废弃的getYear()/setYear()API。这组API不会返回4位完整年份,仅返回当前年份与1900的差值,比如1906年返回6、1917年返回17、2020年返回120,这就是控制台出现6、17这类异常年份值的直接原因。获取/设置完整年份必须使用getFullYear()/setFullYear()。
  • 在filter遍历过程中反复修改外部定义的基准时间beginningTimeValue。每遍历一行数据,你都会把基准时间的年、月、日替换成当前行的日期值,第一次遍历结束后基准时间就已经不是初始定义的2020-01-01 08:00:00,后续比对的基准值完全错乱。
  • 时间字段截取逻辑错误。小时、分钟、秒都是两位长度,你写的substring(11,12)、substring(13,14)、substring(15,16)只能截取到第一位数字,根本拿不到完整的时分秒值。
  • 基础逻辑写法错误:
    • 空值判断!beginningTimeValue == ""逻辑完全不成立:beginningTimeValue是Date对象,转布尔值为true,取反后为false,false和空字符串做弱类型比较永远为true,这个判断根本起不到空值校验作用。
    • 传入Date构造函数的年、月、日、时、分、秒都是字符串类型,虽然JS会做隐式转换,但部分运行环境(包括Google Apps Script的V8 runtime)下会出现解析异常,最好显式转为数字类型。
修复后可直接运行的代码
var beginningTimeValue = new Date('2020-01-01 08:00:00');
var endingTimeValue = new Date('2020-01-01 13:00:00');
var unique = [
  ["value","value","value","value","12/01/2021 00:03:35","value"],
  ["value","value","value","value","01/01/2020 00:03:35","value"],
  ["value","value","value","value","01/01/2020 08:03:35","value"],
  ["value","value","value","value","01/01/2020 13:03:35","value"]
]

// 用有效日期判断替代错误的空值判断
if (!isNaN(beginningTimeValue.getTime())) {
  // 提前缓存基准时间戳,循环内禁止修改原始基准值
  const baseTimestamp = beginningTimeValue.getTime();
  unique = unique.filter(function(row) {
    const dateStr = row[4];
    // 修正截取范围,所有值转10进制数字避免解析异常
    const rYear = parseInt(dateStr.substring(6, 10), 10);
    const rMonth = parseInt(dateStr.substring(3, 5), 10);
    const rDay = parseInt(dateStr.substring(0, 2), 10);
    const rHour = parseInt(dateStr.substring(11, 13), 10);
    const rMinute = parseInt(dateStr.substring(14, 16), 10);
    const rSecond = parseInt(dateStr.substring(17, 19), 10);
    // 构造当前行的日期对象,月份参数需要减1
    const rowDate = new Date(rYear, rMonth - 1, rDay, rHour, rMinute, rSecond);
    
    console.log("原始字符串日期 = " + rYear + "/" + rMonth + "/" + rDay);
    // 用getFullYear获取完整4位年份,月份输出时加1还原成自然月计数
    console.log("解析后Date对象 = " + rowDate.getFullYear() + "/" + (rowDate.getMonth() + 1) + "/" + rowDate.getDate());

    return rowDate.getTime() >= baseTimestamp;
  });
}
修复要点说明
  • 所有废弃的getYear()/setYear()全部替换为getFullYear()/setFullYear(),从根源解决年份返回异常值的问题。
  • 循环开始前提前缓存基准时间的时间戳,循环内只做值比对,不修改任何外部基准变量,避免遍历过程中基准值被污染。
  • 调整substring的截取范围,正确获取两位长度的小时、分钟、秒值,所有截取到的字符串显式转为10进制数字后再传入Date构造函数,避免隐式转换带来的解析异常。
  • 用isNaN(日期对象.getTime())判断Date对象是否有效,替代原有错误的空值判断逻辑。
  • 直接用固定缓存的时间戳做大小比对,减少不必要的对象属性修改操作,逻辑更稳定,执行效率更高。

内容的提问来源于stack exchange,提问作者Rus Paul Adrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:57:20