JSON.stringify()
是一种将 JavaScript 对象转换为 JSON 字符串的方法。在使用此函数时,您可能会遇到一个问题:当您将具有时间戳属性的 JavaScript 对象传递给 JSON.stringify()
时,它们的值可能会与期望的不同,因为它们受到 UTC 日期的影响。
UTC 日期是什么?
UTC (协调世界时)是标准时间,可用作全球通用时间,使国家和地区可以通过相同的参考点进行时间测量。UTC 也被称为格林尼治标准时间(GMT)。
JavaScript 中基于时间戳的日期对象存储了自 1970 年 1 月 1 日 00:00:00 UTC 起的毫秒数。这意味着时间戳是以 UTC 时间存储的。
在使用 JSON.stringify()
将具有时间戳属性的对象序列化为 JSON 字符串时,时间戳的值将被转换为 ISO 格式的字符串。ISO 格式包括日期和时间,并且以 UTC 时间为基准。
const dateObj = new Date('2023-04-07T00:00:00.000Z'); console.log(dateObj.toISOString()); // 2023-04-07T00:00:00.000Z
上面代码中,toISOString()
方法返回一个表示日期时间的字符串,格式为 "YYYY-MM-DDTHH:mm:ss.sssZ"。这是 ISO 标准格式,可与 JSON.stringify()
一起使用。
UTC 日期对 JSON.stringify 的影响
如果您将带时间戳属性的对象传递给 JSON.stringify()
,则输出字符串中的时间戳可能会比输入对象中的时间戳早或晚若干小时,这取决于所处时区和 UTC 时间之间的差异。
例如,在美国东部标准时间(EST)下运行以下代码:
const dateObj = new Date('2023-04-07T00:00:00.000Z'); const jsonString = JSON.stringify({date: dateObj}); console.log(jsonString); // {"date":"2023-04-06T20:00:00.000Z"}
在上面的示例中,我们创建一个时间戳为 2023 年 4 月 7 日的日期对象,并将其传递给 JSON.stringify()
。但是,由于 EST 时间与 UTC 时间相差 4 个小时,因此输出字符串中的时间戳表示为 “2023-04-06T20:00:00.000Z”,即比输入对象中的时间戳早了 4 个小时。
其他时区也可能受到类似影响。
如何解决?
要解决此问题,您可以通过将对象的时间戳转换为本地时间来消除 UTC 时间的影响,然后再将其传递给 JSON.stringify()
。
const dateObj = new Date('2023-04-07T00:00:00.000Z'); const localOffset = dateObj.getTimezoneOffset() * 60000; // Timezone offset in milliseconds const localDate = new Date(dateObj - localOffset); const jsonString = JSON.stringify({date: localDate}); console.log(jsonString); // {"date":"2023-04-07T00:00:00.000Z"}
在上述示例中,我们通过 getTimezoneOffset()
方法计算出当前本地时间与 UTC 时间之间的分钟差异。然后将此差异转换为毫秒数,并使用 new Date()
构造函数创建一个新的本地日期对象。这个新的日期对象包含了正确的本地时间戳值,可以安全地传递给 JSON.stringify()
。
结论
当您使用 JSON.stringify()
将带有时间戳属性的对象序列化为 JSON 字符串时,记住它们的值将以 UTC 格式存储。如果您需要消除这种
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/13149