Date.prototype.toJSON()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

toJSON() 方法是 Date 实例的一个方法,它返回一个字符串,该字符串以与 toISOString() 相同的 ISO 格式表示此日期。

试一试

const event = new Date("August 19, 1975 23:15:30 UTC");

const jsonDate = event.toJSON();

console.log(jsonDate);
// Expected output: "1975-08-19T23:15:30.000Z"

console.log(new Date(jsonDate).toUTCString());
// Expected output: "Tue, 19 Aug 1975 23:15:30 GMT"

语法

js
toJSON()

参数

无。

返回值

根据通用时间,返回一个表示给定日期的 日期时间字符串格式 的字符串,或者当日期 无效 时返回 null。对于有效日期,返回值与 toISOString() 的返回值相同。

描述

Date 对象被字符串化时,JSON.stringify() 会自动调用 toJSON() 方法。此方法通常旨在默认有用地序列化 Date 对象,以便在 JSON 序列化期间,可以使用 Date() 构造函数作为 JSON.parse() 的 reviver 来反序列化它们。

该方法首先尝试通过按顺序调用其 [Symbol.toPrimitive]()(使用 `"number"` 作为提示)、valueOf()toString() 方法,将 this转换为原始值。如果结果是 非有限 数字,则返回 null。(这通常对应于无效日期,其 valueOf() 返回 NaN。)否则,如果转换后的原始值不是数字或是一个有限数字,则返回 this.toISOString() 的返回值。

请注意,该方法不检查 this 值是否为有效的 Date 对象。但是,在非 Date 对象上调用 Date.prototype.toJSON() 会失败,除非该对象的数字原始表示形式为 NaN,或者该对象也具有 toISOString() 方法。

示例

使用 toJSON()

js
const jsonDate = new Date(0).toJSON(); // '1970-01-01T00:00:00.000Z'
const backToDate = new Date(jsonDate);

console.log(jsonDate); // 1970-01-01T00:00:00.000Z

序列化往返

在解析包含日期字符串的 JSON 时,可以使用 Date() 构造函数将它们还原为原始日期对象。

js
const fileData = {
  author: "Maria",
  title: "Date.prototype.toJSON()",
  createdAt: new Date(2019, 3, 15),
  updatedAt: new Date(2020, 6, 26),
};
const response = JSON.stringify(fileData);

// Imagine transmission through network

const data = JSON.parse(response, (key, value) => {
  if (key === "createdAt" || key === "updatedAt") {
    return new Date(value);
  }
  return value;
});

console.log(data);

注意: JSON.parse() 的 reviver 必须针对您期望的有效负载形状进行指定,因为序列化是不可逆的:无法区分表示日期的字符串和普通字符串。

规范

规范
ECMAScript® 2026 语言规范
# sec-date.prototype.tojson

浏览器兼容性

另见