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
相关产品推荐
相关产品推荐

