JavaScript中如何格式化非标准日期以兼容原生Date函数?
解决非标准12小时制日期字符串的解析问题
首先,先说说你用Moment.js遇到的「invalid date」问题——其实是因为你没有指定自定义解析格式,Moment默认没法自动识别这种Mar 8, 2019 5:13pm GMT+0100的格式。你只需要在调用moment时传入对应的格式字符串就能解决:
function returnFormatedDate(dt) { // 自定义解析格式:MMM(月份缩写)、D(日期)、YYYY(年份)、h(12小时制小时)、mm(分钟)、a(am/pm)、Z(时区偏移) return moment(dt, 'MMM D, YYYY h:mma Z').format('DD.MM.YY HH:mm'); } // 测试一下 console.log(returnFormatedDate("Mar 8, 2019 5:13pm GMT+0100")); // 输出 "08.03.19 17:13" console.log(returnFormatedDate("Mar 8, 2019 12:05am GMT+0100")); // 输出 "08.03.19 00:05"
如果不想依赖Moment.js,用原生JavaScript也能实现,你提到的Chris G的思路可以优化得更健壮一点,比如处理12am的特殊情况(要转成00点),同时简化代码逻辑:
function parseCustomDate(dateStr) { const parts = dateStr.split(' '); const timePart = parts[3]; let [hour, minute] = timePart.replace(/(am|pm)/, '').split(':'); // 处理pm和am的小时转换,兼容12点的边界情况 if (timePart.includes('pm')) { hour = hour === '12' ? '12' : String(Number(hour) + 12); } else { hour = hour === '12' ? '00' : hour; } // 补全分钟(如果遇到无分钟的格式,比如"5pm",自动补为00) minute = minute || '00'; // 重组能被Date原生解析的字符串 const parsedStr = `${parts[0]} ${parts[1]} ${parts[2]} ${hour}:${minute}:00 ${parts[4]}`; return new Date(parsedStr); } // 测试示例 const date = parseCustomDate("Mar 8, 2019 5:13pm GMT+0100"); console.log(date.toISOString()); // 输出标准ISO格式日期 console.log(date.toLocaleString()); // 输出本地格式日期
补充说明
- 原生方案额外处理了
12am转00、12pm保持12的特殊场景,避免出现不符合Date规范的数值。 - 如果你的日期字符串还有其他变体(比如不带分钟的
5pm),上面的代码也能兼容,会自动补全分钟为00。
内容的提问来源于stack exchange,提问作者spyro95
相关产品推荐
相关产品推荐

