JSON.parse 的 reviver 函数可将符合 ISO 8601 格式的字符串(如 "2023-10-05T14:30:00Z")自动转为 Date 对象,需用正则校验格式并验证日期有效性,且支持嵌套结构和字段名双重判断策略。

在 JavaScript 中,JSON.parse 的 reviver 函数可以用来在解析过程中对每个键值对进行处理。要自动把符合日期格式的字符串(比如 "2023-10-05T14:30:00.000Z")转成 Date 对象,关键在于:**识别日期字符串、避免误转、只转换值为字符串且符合 ISO 8601 格式的字段**。
识别标准 ISO 日期字符串
不是所有字符串都该转成日期。常见做法是用正则匹配典型的 ISO 8601 时间戳(含或不含毫秒、有时区或 UTC 标记),例如:
"2023-10-05T14:30:00Z""2023-10-05T14:30:00.123+08:00"-
"2023-10-05"(纯日期,也可考虑支持)
推荐正则:/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?$/
它能较可靠地排除像 "2023-13-01"(非法月份)这类无效字符串——虽然 Date 构造函数会默默纠正,但最好靠正则先过滤。
reviver 函数的基本写法
reviver 接收两个参数:key(当前属性名)和 value(当前值)。返回值将替代原值;若返回 undefined,该属性会被忽略(慎用)。
示例代码:
function dateReviver(key, value) {
if (typeof value === 'string') {
const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?$/;
if (isoDateRegex.test(value)) {
const date = new Date(value);
// 验证是否为有效日期(防止 "2023-02-30" 等解析成 Invalid Date)
if (!isNaN(date.getTime())) {
return date;
}
}
}
return value; // 其他类型或非日期字符串保持原样
}
// 使用
const json = '{"created":"2023-10-05T14:30:00Z","name":"test","invalid":"2023-02-30T00:00:00Z"}';
const obj = JSON.parse(json, dateReviver);
// obj.created 是 Date 实例,obj.invalid 仍是字符串
注意嵌套对象和数组中的日期
reviver 会递归遍历所有层级(包括数组元素),所以无需额外处理嵌套结构。例如:
{"users":[{"joined":"2022-01-01T00:00:00Z"}]}
里面的 "joined" 字符串也会被 reviver 捕获并转换——因为 reviver 在每个属性/数组项上都会被调用一次。
但要注意:key 为空字符串("")时,表示正在处理整个 JSON 值本身,此时 value 就是根对象或数组,通常不需要特殊处理。
可选增强:支持自定义字段名或多种格式
如果后端约定某些字段名一定存日期(如 createdAt、updatedAt、dob),可结合字段名 + 字符串类型双重判断,更精准:
function smartDateReviver(key, value) {
const dateFields = ['createdAt', 'updatedAt', 'dob', 'expiresAt'];
const isDateString = typeof value === 'string';
const isKnownDateField = dateFields.includes(key);
if (isDateString && isKnownDateField) {
const d = new Date(value);
return isNaN(d.getTime()) ? value : d;
}
// 同时保留 ISO 字符串自动识别逻辑(兜底)
if (isDateString) {
const isoRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/;
if (isoRegex.test(value)) {
const d = new Date(value);
return isNaN(d.getTime()) ? value : d;
}
}
return value;
}
这种混合策略兼顾了语义明确性和格式兼容性,适合实际项目中使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











