JSON.parse解析时间戳返回错误日期(少一个月)的问题求助
问题原因分析:日期少解析一个月的根源
这个问题的核心原因其实是JavaScript里一个很容易踩的小坑——Date对象的月份是从0开始索引的:0对应1月,1对应2月……以此类推,4就对应5月。你的时间戳本身是完全正确的,但在格式化日期的时候,大概率直接用了getMonth()的返回值,没给它加1,才导致月份少了一个月。
我们一步步拆解验证:
- 先确认时间戳的正确性:
1273474800000这个毫秒级时间戳,对应的UTC时间是2010-05-10T03:00:00.000Z,换成东八区本地时间就是2010-05-10 11:00:00,时间戳本身没有任何问题。 - 原生
JSON.parse不会自动把数字转成Date对象,所以你肯定是用了自定义reviver函数或者第三方库做了转换。当时间戳变成Date对象后,调用date.getMonth()会返回4——这是JavaScript的设计规则,月份索引从0开始计数。 - 如果你直接把这个
4当成月份拼接成日期字符串,自然就会得到2010-04-10;但正确的做法应该是给这个值加1,变成5,才能得到正确的5月。
给你看个代码对比的例子:
const jsonStr = '{ "nyear":2015, "nperiod":12, "ddelivtime":1273474800000, "vpoitem":"10", "iversion":1, "vdsnumber":null, "isequence":null }'; // 解析JSON并将时间戳转为Date对象 const data = JSON.parse(jsonStr, (key, value) => { return key === 'ddelivtime' ? new Date(value) : value; }); // ❌ 错误格式化:直接使用getMonth()返回值 const wrongDate = `${data.ddelivtime.getFullYear()}-${String(data.ddelivtime.getMonth()).padStart(2, '0')}-${String(data.ddelivtime.getDate()).padStart(2, '0')}`; console.log(wrongDate); // 输出:2010-04-10 // ✅ 正确格式化:给月份值加1 const correctDate = `${data.ddelivtime.getFullYear()}-${String(data.ddelivtime.getMonth() + 1).padStart(2, '0')}-${String(data.ddelivtime.getDate()).padStart(2, '0')}`; console.log(correctDate); // 输出:2010-05-10
另外可以排除时区的影响:时区最多只会让日期差几天,不可能直接跨一个月,所以只需要检查你的日期格式化逻辑,确保给getMonth()的返回值加1就能解决问题。
内容的提问来源于stack exchange,提问作者cipley
相关产品推荐
相关产品推荐

