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

Google Script中如何比较'D MMM YY - HH.MM.SS'格式的日期?

如何在Google Script中比较特定格式的日期字符串

嘿,你已经有脚本编程基础,这事儿就好办多了!针对你想比较'D MMM YY - HH.MM.SS'格式日期的需求,完全不需要引入moment.js——Google Script自带的工具就足够轻量且高效地解决这个问题,咱们一步步来:

核心思路:把字符串转成Date对象

日期字符串直接用字符串比较会出问题(比如字符串排序是按字符顺序,'14 Jul 16'和'5 May 17'比的话,'1'比'5'小,会误判)。正确的做法是把字符串转换成Date对象,因为Date可以直接通过>、<等运算符对比时间先后(本质是比较时间戳数值)。

方法一:用Google Script内置的Utilities.parseDate(推荐)

Google Script的Utilities类提供了专门的日期解析方法,完美适配你的格式,不用自己造轮子:

function compareFormattedDates() {
  // 你的日期字符串示例
  const dateA = '14 Jul 16 - 16.34.06';
  const dateB = '5 May 17 - 08.24.27';
  const dateC = '7 Oct 16 - 09.19.55';
  const dateD = '28 Nov 16 - 02.06.12';

  // 定义和你的日期字符串完全匹配的格式模板
  const dateFormat = 'd MMM yy - HH.mm.ss';
  // 指定时区(避免解析偏差,用脚本默认时区最稳妥)
  const timeZone = Session.getScriptTimeZone();

  // 把字符串转成Date对象
  const parsedA = Utilities.parseDate(dateA, timeZone, dateFormat);
  const parsedB = Utilities.parseDate(dateB, timeZone, dateFormat);
  const parsedC = Utilities.parseDate(dateC, timeZone, dateFormat);
  const parsedD = Utilities.parseDate(dateD, timeZone, dateFormat);

  // 现在可以直接比较了!
  if (parsedA > parsedB) {
    Logger.log('这个条件不会成立,因为2016年的日期早于2017年');
    // 你的业务逻辑
  }

  if (parsedC < parsedD) {
    Logger.log('这个条件成立,10月7日确实早于11月28日');
    // 你的业务逻辑
  }
}

关键细节说明:

  • 格式模板'd MMM yy - HH.mm.ss'要和你的字符串严格对应:
    • d:一位或两位的日期(比如7或14)
    • MMM:英文月份缩写(比如Jul、Oct)
    • yy:两位年份(会自动解析为20xx,比如16→2016)
    • HH:24小时制的小时数
    • mm/ss:分钟/秒,分隔符用.和你的字符串一致
  • 时区必须指定:Google Script在云端运行,用Session.getScriptTimeZone()获取脚本设置的默认时区,避免解析出错误的时间。

方法二:手动解析字符串(不推荐,仅作参考)

如果你想完全手动实现解析,也可以拆分字符串并构造Date对象,但需要处理更多细节(比如月份缩写转数字、年份补全),代码会更繁琐:

function manualDateParser(dateStr) {
  // 拆分日期和时间部分
  const [datePart, timePart] = dateStr.split(' - ');
  // 拆分日期的日、月、年
  const [day, monthStr, year] = datePart.split(' ');
  // 月份缩写转数字(注意Date的月份是0开始的:Jan=0,Dec=11)
  const monthMap = {
    Jan:0, Feb:1, Mar:2, Apr:3, May:4, Jun:5,
    Jul:6, Aug:7, Sep:8, Oct:9, Nov:10, Dec:11
  };
  const month = monthMap[monthStr];
  // 补全年份(假设是2000年后的日期)
  const fullYear = parseInt(year, 10) + 2000;
  // 拆分时间的时、分、秒
  const [hour, minute, second] = timePart.split('.').map(Number);

  // 构造Date对象
  return new Date(fullYear, month, day, hour, minute, second);
}

// 调用示例
const parsedA = manualDateParser('14 Jul 16 - 16.34.06');
const parsedB = manualDateParser('5 May 17 - 08.24.27');
console.log(parsedA < parsedB); // 返回true,符合预期

总结

  • 优先用Utilities.parseDate:内置方法更可靠,不用处理边缘情况,代码更简洁
  • 完全不需要moment.js:Google Script的原生工具已经能满足需求,避免引入额外体积
  • 记住核心:把日期字符串转成Date对象,就能直接用比较运算符判断先后啦!

内容的提问来源于stack exchange,提问作者Mikael Ellingsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:57:16