JavaScript中new Date()返回默认日期字符串的格式规范是什么
new Date() 默认返回字符串格式与moment严格校验问题解决方案 调用new Date()得到的字符串是ECMAScript标准定义的实现相关的人类可读时间字符串,没有强制统一的跨引擎格式规范,在en_US区域、Chrome/Node.js使用的V8引擎下,输出结构固定为如下形式:
Wed Jul 13 2022 16:15:35 GMT-0600 (Central Standard Time)
之前格式匹配失败的原因
你使用的格式串E MMM d yyyy H:mm:ss zzzz和实际输出存在三处不匹配,因此无法通过moment严格校验:
- 星期token使用错误:moment中3位缩写星期(如Wed)对应的解析token是
ddd,E代表ISO周序号的数字值,无法匹配字符串格式的星期 - 时区偏移格式不匹配:实际输出的时区偏移为
GMT-0600,偏移量部分不带冒号,zzzz解析出的偏移格式为带冒号的GMT-06:00,和实际字符不符 - 遗漏末尾字段:实际字符串最后有括号包裹的时区全称(如
(Central Standard Time)),原格式串没有对应匹配规则
可通过严格校验的正确格式
针对V8引擎en_US区域下的new Date()输出,可通过严格校验的moment解析格式串为:
ddd MMM D YYYY HH:mm:ss [GMT]ZZ (z)
各段对应匹配逻辑:
ddd:匹配3位星期缩写MMM:匹配3位月份缩写D:匹配无前导零的日期数值YYYY:匹配4位年份HH:mm:ss:匹配24小时制的时、分、秒[GMT]:字面量匹配固定的GMT前缀,方括号代表按固定字符匹配,不做格式解析ZZ:匹配不带冒号的4位时区偏移值(如-0600)(z):匹配括号包裹的时区名称
替换格式串后的测试代码如下,执行后isValid()会返回true:
const date = 'Wed Jul 13 2022 16:15:35 GMT-0600 (Central Standard Time)'; let momentDate = moment(date, 'ddd MMM D YYYY HH:mm:ss [GMT]ZZ (z)', true); console.log(momentDate.isValid()); // true
实践建议
不要依赖new Date()的默认返回字符串做跨环境的时间解析:不同JS引擎(如Safari的JavaScriptCore、Firefox的SpiderMonkey)的默认输出格式存在细节差异,跨场景解析很容易失败。如果需要稳定的时间字符串交互,优先使用new Date().toISOString()生成标准ISO 8601格式字符串,所有JS引擎对该格式的解析、输出规则完全统一。
内容的提问来源于stack exchange,提问作者Resident Zero9999
相关产品推荐
相关产品推荐

