JSON中正确的日期格式是什么?

JSON中正确的日期格式是什么?

技术背景

JSON(JavaScript Object Notation) 本身并没有规定日期的表示格式,这就导致在实际应用中存在多种表示日期的方式。在不同的系统交互和数据传输中,选择合适的日期格式对于数据的处理至关重要。

实现步骤

使用ISO 8601格式

ISO 8601 是一种国际标准的日期和时间表示方法,其常见格式为 YYYY-MM-DDTHH:mm:ss.sssZ,例如 2012-04-23T18:25:43.511Z。许多现有的日期库都能很好地处理这种格式。在JavaScript中,Date 对象的 toJSON 方法默认使用 toISOString 方法,会输出符合ISO 8601格式的日期字符串。

1
2
3
const json = JSON.stringify(new Date());
const parsed = JSON.parse(json);
const date = new Date(parsed);

利用 reviver 参数自动转换

可以借助 JSON.parsereviver 参数将ISO 8601 字符串自动转换为 JavaScript 的 Date 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
const isoDatePattern = new RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/);
const obj = {
a: 'foo',
b: new Date(1500000000000)
};
const json = JSON.stringify(obj);
const parsed = JSON.parse(json, (key, value) => {
if (typeof value === 'string' && value.match(isoDatePattern)){
return new Date(value);
}
return value;
});
console.log(parsed.b);

其他日期格式及特点

时间戳(毫秒数)

表示自 1970 年 1 月 1 日以来的毫秒数,可轻松传递给 new Date() 构造函数,是便携性较高的格式。然而,由于闰秒实现的差异,使用这种格式可能存在风险。

EJSON 格式

格式为 { "myDateField": { "$date" : <ms-since-epoch> } },具有解析性能高、无需日期验证、类型声明明确等优点,适用于需要保证数据类型无误的通用传输场景。

自定义对象模型

可以使用包含年、月、日、时、分、秒和时区等字段的对象来表示日期,虽然更冗长,但具有人类可读、支持时区和更小时间单位、无需单独解析等优势。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"person": {
"name": {
"first": "Tom",
"middle": "M"
},
"dob": {
"year": 2012,
"month": 4,
"day": 23,
"hour": 18,
"minute": 25,
"second": 43,
"timeZone": "America/New_York"
}
}
}

最佳实践

  • 若能够控制 JSON 数据的生成,建议选择 ISO 8601 格式,因其通用性强,许多编程语言都能处理。
  • 若不能控制生成的 JSON 格式,可编写日期解析工具函数来处理不同格式。

常见问题

闰秒问题

使用基于纪元的时间戳(秒或毫秒数)时,由于闰秒的随机实现,发送方和接收方可能对闰秒的处理不同,导致时间不准确。

日期验证问题

即使字符串符合 ISO 8601 格式,也可能不是有效的日期。使用 EJSON 格式可避免此问题。


JSON中正确的日期格式是什么?
https://119291.xyz/posts/what-is-the-right-json-date-format/
作者
ww
发布于
2025年5月30日
许可协议