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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:09:51