【问题标题】:How to stringify dates with timezones properly in javascript?如何在javascript中正确地用时区对日期进行字符串化?
【发布时间】:2019-10-13 09:10:42
【问题描述】:

在 javascript 中,我有一个 UTC 日期,我想对其进行字符串化并解析它,但保持它是 UTC。我做了这段代码

var f = { f : new Date("Mon May 27 2019 20:11:13 GMT-0400 (Eastern Daylight Time)")}

未定义

JSON.stringify(f)

"{"f":"2019-05-28T00:11:13.000Z"}"

JSON.parse(JSON.stringify(f))

{f: "2019-05-28T00:11:13.000Z"}

你可以看到,我把它串起来之后,它变成了第二天。然后当我解析它时,它把它保存为一个字符串,甚至是第二天的字符串。我想要它,以便在我解析它之后,我得到 Mon May 27 2019 20:11:13 GMT-0400 (Eastern Daylight Time) 的 Date 对象。

有谁知道怎么回事?

谢谢

【问题讨论】:

  • 时区...第二天是UTC时间。
  • 日期对象是UTC,时区来自主机系统。您的“第二天”是因为 2019-05-28T00:11:13.000Z 与 2019 年 5 月 27 日 20:11:13 GMT-0400(东部夏令时间)的时间相同,因为时区有 4 小时的差异。 PS,这是许多类似问题的重复。
  • 2019-05-28T00:11:13.000ZMon May 27 2019 20:11:13 GMT-0400 (Eastern Daylight Time) 的 ISO 格式。当您尝试new Date('2019-05-28T00:11:13.000Z') 时,它会创建一个您想要获取的日期。
  • 有没有办法覆盖这些函数以保留时区数据并恢复我最初的原始日期?
  • 只有使用库,内置日期只是一个时间值(从一个纪元开始的毫秒偏移量),它们不保存其他数据。

标签: javascript json date


【解决方案1】:

你可以看到,我把它串起来后,它变成了第二天

不,它没有。 “2019 年 5 月 27 日星期一 20:11:13 GMT-0400(东部夏令时间)”被解析为时间值 1559002273000,它定义了 1970-01-01T00:00:00Z 之后的毫秒数。它相当于 2019-05-28T00:11:13.000Z (以及其他时区的其他时间戳)。例如。在设置为澳大利亚东部时区的系统上,您会看到“Tue May 28 2019 10:11:13 GMT+1000 (AEST)”。

我想要它,以便在我解析它之后,我得到 Mon May 27 2019 20:11:13 GMT-0400(东部夏令时间)的 Date 对象

日期对象不知道原始时间戳的时区,它只是存储时间值。 toString 生成的字符串仅使用主机系统时区设置来生成 ECMA-262 指定格式的“本地”时间戳。请注意,时区名称取决于实现,并且由于它们不是标准化的,因此名称和缩写在实现之间会有所不同。例如。 Safari 显示“AEST”,Firefox 显示“澳大利亚东部标准时间”。

您可以使用toLocaleString 为不同的时区生成时间戳,但日期对象不知道原始时区是什么,并且格式可能不是您想要的。

另外,toLocaleString 使用IANA timezone identifiers(例如非洲/金沙萨),它与用于推断适用时区的地理位置有关,而不是像“东部夏令时间”这样的常用名称标准化,可以是模棱两可或晦涩难懂的。 IANA 代号意味着比其他代号更容易应用夏令时和历史时区偏移更改。

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 2015-09-14
    • 2012-12-16
    • 2016-05-15
    • 2015-07-06
    • 2011-06-12
    相关资源
    最近更新 更多