json不支持日期类型,date序列化为iso字符串后反序列化不会自动还原,需通过replacer统一格式化、reviver识别转换,并用工具函数或类封装逻辑确保时区一致。

JavaScript 中 JSON 本身不支持日期类型,Date 对象会被序列化为 ISO 8601 字符串(如 "2024-05-20T08:30:00.000Z"),但反序列化时不会自动还原为 Date 实例——它只是普通字符串。要正确处理日期与时间的格式化,关键在于「序列化时保留信息」+「解析时主动转换」。
序列化时手动控制日期格式
默认 JSON.stringify(new Date()) 输出的是带毫秒和时区的 UTC 字符串,有时不符合后端要求或展示需求。可传入 replacer 函数统一处理:
- 转为本地时间字符串:
date.toLocaleString('zh-CN')(如 "2024/5/20 上午8:30:00") - 转为自定义格式(年月日时分秒):
`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')} ${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}:${String(d.getSeconds()).padStart(2,'0')}` - 保持 ISO 格式但去掉毫秒:
d.toISOString().slice(0, 19)→ "2024-05-20T08:30:00"
解析时识别并还原为 Date 对象
JSON.parse() 不会自动把字符串变回 Date,需在 reviver 函数中识别常见日期格式:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 匹配 ISO 格式(含 T 和 Z):
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,3})?Z?$/ - 匹配常见中文/短格式(如 "2024-05-20 08:30:00"):可扩展正则或用
Date.parse(str)尝试解析 - 示例 reviver:
JSON.parse(jsonStr, (key, val) => { if (typeof val === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(val)) { return new Date(val); } return val; });
用类或工具函数封装日期字段逻辑
避免每次手动处理,可定义统一的数据模型:
- 发送前:调用
toJSON()方法(Date 原生支持,但返回 ISO 字符串;自定义类可覆盖) - 接收后:用工具函数批量转换,例如:
function parseDates(obj) { /* 递归遍历 key 匹配 'time'、'date'、'createdAt' 等 */ } - 使用库辅助(如
superjson或flatted)可自动序列化/反序列化 Date,但需权衡包体积与控制粒度
注意时区与显示一致性
前端展示日期时,ISO 字符串默认按本地时区解析,容易导致“明明存的是北京时间,显示却少8小时”。建议:
- 后端统一返回带时区的 ISO 字符串(如 "2024-05-20T08:30:00+08:00"),前端
new Date(str)能正确识别 - 展示时用
toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })强制按东八区渲染 - 避免用
getHours()等本地方法直接取值,优先用getUTCHours()+ 时区偏移计算,或依赖Intl.DateTimeFormat
不复杂但容易忽略:JSON 是纯数据格式,日期逻辑必须由开发者显式约定和实现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










