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

Moment解析非标准格式日期Jun 27 2022 03:40:00:000PM报错如何解决

Moment解析非标准接口日期字符串失败问题

问题描述

调用接口返回的时间字段为人类可读日期字符串,使用moment解析时无法正确获取时间数据,接口返回的时间字段内容如下:

{"time": "Jun 27 2022 03:40:00:000PM"}

先后尝试了两种解析写法,均未生效:

let data = moment("Jun 27 2022 03:40:00:000PM").format()
// 第二种尝试写法
let data = moment("Jun 27 2022 03:40:00:000PM").format("YYYY-MM-DD") 

两种写法都会触发如下弃用警告:

Deprecation warning: value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release.

问题原因

  • 拿到的日期字符串不属于moment默认支持的RFC2822或ISO标准格式:标准时间格式里秒和毫秒的分隔符是.,但接口返回的字符串里用了冒号(即00:000PM这段不符合规范),moment无法自动识别格式,只能回退到原生JS的Date()方法做解析,不仅结果不可靠,还会抛出跨浏览器兼容相关的弃用警告。
  • moment官方本身就不推荐直接向构造函数传入非标准格式的日期字符串,这类写法在不同浏览器、不同moment版本下解析结果可能不一致。

解决方法

方法1:解析时指定匹配的格式串

这是最稳妥的方案,直接告诉moment你的日期字符串每个部分对应的格式规则,不需要修改原始字符串:

// 第二个参数传入和原始字符串完全匹配的格式标识
const parsedTime = moment("Jun 27 2022 03:40:00:000PM", "MMM DD YYYY hh:mm:ss:SSSA")
// 解析完成后可以正常格式化输出需要的格式
const formatDate = parsedTime.format("YYYY-MM-DD HH:mm:ss")

格式标识对应说明:

  • MMM:三位英文缩写月份
  • DD:两位日期
  • YYYY:四位年份
  • hh:12小时制的小时数
  • mm:分钟
  • ss:秒
  • SSS:三位毫秒
  • A:大写的AM/PM标识

如果项目里用了多语言环境,解析时还可以额外指定语言参数,避免英文月份识别失败。

方法2:预处理原始字符串转成标准格式

如果不想手动写长串格式标识,可以先把原始字符串里不符合规范的分隔符替换掉,转成moment能自动识别的标准格式再解析:

const rawTimeStr = "Jun 27 2022 03:40:00:000PM"
// 正则匹配秒和毫秒之间的冒号,替换为标准的点分隔符
const standardTimeStr = rawTimeStr.replace(/:(\d{3}[AP]M)$/, ".$1")
const parsedTime = moment(standardTimeStr)

两种方法都可以正常解析出正确时间,不会触发弃用警告。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:48:51