使用JSON.parse处理载荷后日期对象值与原值不一致问题求解
问题根因
- 基础代码错误:
JSON.parse()仅支持接收JSON格式字符串作为入参,如果你代码中的payload是直接定义的JS对象而非JSON字符串,入参时会触发隐式类型转换,可能出现不可预期的格式异常。 - 核心原因是时区自动转换:你原始载荷里的日期是后缀带
Z的ISO 8601格式,Z代表该时间为UTC(世界协调时间)零时区时间。JS环境在打印Date类型对象时,会默认转换为运行设备当前设置的本地时区,你设备的时区为GMT+11的澳大利亚东部夏令时,UTC时间11月20日20点叠加11小时时差后,自然会显示为11月21日的本地时间。两者对应的Unix时间戳完全一致,只是时区显示不同。
解决方案
如果你需要保证日期的显示结果和原始载荷完全一致,可以根据使用场景二选一:
- 保留原始日期字符串,不转换为Date对象
调用JSON.parse()时传入第二个reviver回调函数,匹配到日期字段时直接返回原始字符串:
// 注意payload需为JSON字符串,不是JS对象 const job = JSON.parse(payload, (key, value) => { // 可根据字段名或者ISO日期格式正则匹配 if (key === 'startDate' || key === 'endDate') { return value; } return value; });
- 打印Date对象时主动输出UTC格式
如果业务逻辑需要用到Date类型做时间运算,打印时调用UTC格式转换方法即可:
const startDate = job.timeDetails[0].windowTimes.startDate; console.log(startDate.toUTCString()); // 输出结果:Sat, 20 Nov 2021 20:39:46 GMT,和原始载荷完全一致
内容的提问来源于stack exchange,提问作者ArthurJ
相关产品推荐
相关产品推荐

