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

JSON.parse解析时间戳返回错误日期(少一个月)的问题求助

问题原因分析:日期少解析一个月的根源

这个问题的核心原因其实是JavaScript里一个很容易踩的小坑——Date对象的月份是从0开始索引的:0对应1月,1对应2月……以此类推,4就对应5月。你的时间戳本身是完全正确的,但在格式化日期的时候,大概率直接用了getMonth()的返回值,没给它加1,才导致月份少了一个月。

我们一步步拆解验证:

  1. 先确认时间戳的正确性:1273474800000这个毫秒级时间戳,对应的UTC时间是2010-05-10T03:00:00.000Z,换成东八区本地时间就是2010-05-10 11:00:00,时间戳本身没有任何问题。
  2. 原生JSON.parse不会自动把数字转成Date对象,所以你肯定是用了自定义reviver函数或者第三方库做了转换。当时间戳变成Date对象后,调用date.getMonth()会返回4——这是JavaScript的设计规则,月份索引从0开始计数。
  3. 如果你直接把这个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:48:19