Moment.js适配PDT时区正常,IST时区返回NaN问题求助
这个问题我之前也碰到过,核心原因其实是时区缩写的模糊性和JS引擎对它的支持差异,我们一步步来拆解:
问题根源
首先你要注意:new Date("Wed May 30 01:11:36 IST 2018")这行代码本身在大多数JS环境里就会返回一个无效的Date对象(也就是Invalid Date),moment接收这个无效对象后,调用valueOf()自然返回NaN。
为什么PDT没问题?因为PDT(太平洋夏令时)是被主流JS引擎广泛支持的、语义明确的时区缩写;但IST就不一样了——它可能指代印度标准时间(UTC+5:30),也可能是爱尔兰标准时间(UTC+0),这种模糊性导致JS引擎无法准确解析这个时区缩写,直接报错。
你提到moment文档里同一时刻不同时区的valueOf()结果一致,这个是对的,但前提是你的日期字符串能被正确解析成对应的时间点,否则一切都是白搭。至于你尝试的.utc()方法没用,是因为如果原始的Date对象已经是无效的(NaN),再调用.utc()也没办法把无效值变成有效时间戳。
可行的解决方案
这里给你几个靠谱的解决办法:
1. 使用明确的UTC偏移量代替时区缩写
把IST替换成对应的UTC偏移值(比如印度标准时间是UTC+5:30,写成+0530),这样原生Date和moment都能准确解析:
// 印度标准时间的正确写法 var lastActivity = moment(new Date("Wed May 30 01:11:36 +0530 2018")).valueOf();
2. 使用moment-timezone插件指定具体时区
如果你的业务需要频繁处理不同时区,推荐引入moment-timezone插件,用IANA时区名称(比如印度标准时间对应Asia/Kolkata)来明确指定时区,避免缩写的歧义:
// 先确保已引入moment-timezone var lastActivity = moment.tz("Wed May 30 01:11:36 2018", "ddd MMM DD HH:mm:ss YYYY", "Asia/Kolkata").valueOf();
3. 优先使用ISO 8601标准日期格式
ISO 8601格式(比如2018-05-30T01:11:36+05:30)是JS标准支持的日期格式,解析几乎不会出问题,建议日常开发尽量用这种格式:
var lastActivity = moment("2018-05-30T01:11:36+05:30").valueOf();
内容的提问来源于stack exchange,提问作者eureka19

