javascript日期对象经json.stringify()序列化时自动调用tojson()方法,返回utc时区的iso 8601字符串(如"2024-05-20t08:30:45.123z"),不保留本地时区,毫秒补零,且不可配置。

JavaScript 日期对象在调用 JSON.stringify() 时,会自动触发其内置的 toJSON() 方法,该方法返回一个 ISO 8601 格式的字符串(如 "2024-05-20T08:30:45.123Z"),而不是日期对象本身。
toJSON 方法默认行为
Date.prototype.toJSON 是预定义的方法,它等价于 date.toISOString() —— 即转为协调世界时(UTC)的 ISO 字符串,末尾带 Z 表示零时区。即使本地时间是东八区,也不会保留本地时区偏移。
- 不接受参数,始终以 UTC 输出
- 毫秒部分保留三位,不足补零(如
12.3→012) - 不包含本地时区信息(比如
+08:00)
JSON.stringify 中的自动调用机制
当日期对象作为值出现在要序列化的对象中时,JSON.stringify() 会检测该对象是否有 toJSON 方法。如果有,就直接调用它,并用其返回值参与序列化。
例如:
console.log(JSON.stringify(obj));
// → {"time":"2024-05-20T08:30:00.000Z"}
注意:原始日期是北京时间(+08:00),但输出是 UTC 时间(减去 8 小时)。
自定义 toJSON 行为
你可以为某个日期实例或原型覆盖 toJSON,改变 JSON 序列化结果:
- 只影响该实例:
date.toJSON = () => date.toLocaleString(); - 影响所有日期(不推荐):
Date.prototype.toJSON = function() { return this.toLocaleString('zh-CN'); }; - 更安全的做法是在序列化前手动处理,比如用
replacer函数
常见误区与建议
很多人误以为 toJSON() 会保留本地时区或格式可配置,其实它固定为 UTC ISO 字符串。若需本地时间格式、自定义精度或带时区标识,不能依赖默认 toJSON。
- 需要本地时间字符串?用
date.toLocaleString()配合replacer - 需要带时区偏移的 ISO 格式?用
date.toString().match(...)或第三方库(如 dayjs) - 服务端接收时注意:大多数后端解析
"2024-05-20T08:30:00.000Z"默认按 UTC 处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











