如何使用Javascript/Node.js将'x days ago'类字符串解析为标准datetime格式
实现方案
方案1:无第三方依赖原生JS实现
无需引入任何外部库,通过正则匹配和原生Date API即可完成转换:
function parseAgoToISO(agoStr, baseDate = new Date()) { // 匹配数值、时间单位,兼容单复数、大小写 const regMatch = agoStr.match(/^(\d+)\s+(minute|hour|day|month|year)s?\s+ago$/i); if (!regMatch) throw new Error('输入的时间格式不符合要求'); const num = parseInt(regMatch[1], 10); const unit = regMatch[2].toLowerCase(); const targetDate = new Date(baseDate); switch(unit) { case 'minute': targetDate.setMinutes(targetDate.getMinutes() - num); break; case 'hour': targetDate.setHours(targetDate.getHours() - num); break; case 'day': targetDate.setDate(targetDate.getDate() - num); break; case 'month': targetDate.setMonth(targetDate.getMonth() - num); break; case 'year': targetDate.setFullYear(targetDate.getFullYear() - num); break; default: throw new Error('不支持的时间单位'); } // 原生toISOString输出的格式完全符合需求 return targetDate.toISOString(); } // 测试用例 console.log(parseAgoToISO('10 minutes ago')); // 输出示例:2024-05-20T06:22:18.321Z console.log(parseAgoToISO('3 days ago')); console.log(parseAgoToISO('1 year ago'));
该实现支持自定义基准时间(默认用当前时间),月份、闰年等边界场景由原生Date API自动处理,符合通用业务需求。
方案2:使用成熟第三方库实现
如果项目允许引入依赖,推荐用仍在维护的date-fns库直接解析,无需自己处理正则和边界逻辑:
- 先安装依赖:
npm install date-fns - 代码示例:
const { parseRelative, formatISO } = require('date-fns'); // 第二个参数为基准时间,不传默认用当前时间 const parsedDate = parseRelative('2 months ago', new Date()); console.log(formatISO(parsedDate)); // 输出标准ISO时间格式
moment.js核心库本身不支持相对时间字符串解析,需要额外引入对应插件才能实现,且moment官方已宣布停止维护,不建议在新项目中继续使用。
内容的提问来源于stack exchange,提问作者Junaid Anwar
相关产品推荐
相关产品推荐

