【问题标题】:Same date in all timezones所有时区的相同日期
【发布时间】:2021-02-06 06:25:53
【问题描述】:

在所有时区显示相同日期时遇到问题。 用户输入例如 01-01-2002,我将其存储为带有 Eureope/Berlin 时区的日期 parseFromTimeZone(String(birthDate), { timeZone: 'Europe/Berlin' }) parseFromTimeZone 的结果就是这个字符串 '2001-12-31T23:00:00.000Z'。字符串日期与柏林的时区一起计算,这就是它被移动一小时的原因。

我需要在所有时区从'2001-12-31T23:00:00.000Z' 这个01-01-2002 获取。

当我的时区为Europe/PragueEurope/Berlin 时,我使用formatISO(new Date(date), { representation: 'date' })) 这将返回01-01-2002

但是当我将时区更改为America/Tijuana 时,formatISO 返回2001-12-31,这是错误的,我需要与Europe/Berlin 中的日期相同!芽为Asia/Tokyo 这个函数返回01-01-2002 是对的......

一些想法?我尝试了很多解决方案,但没有一个适用于所有时区...

我正在使用"date-fns": "^2.15.0""date-fns-timezone": "^0.1.4"

【问题讨论】:

    标签: javascript react-native timezone date-fns


    【解决方案1】:

    Date 对象,尽管它的名字,并不代表一个“日期”。它代表一个时间戳。它在内部存储的所有内容都是自 Unix 纪元(基于 UTC)以来的毫秒数。它根据 UTC 或运行它的机器的本地时区输出值,具体取决于被调用的函数。

    因此,如果您从仅日期值构造 Date 对象,您实际上是从该时区获取“午夜时间”并将其调整为 UTC。您在Europe/Berlin 中的2002-01-01 示例证明了这一点。您将其视为2002-01-01T00:00:00.000+01:00,它确实具有与2001-12-31T23:00:00.000Z 等效的UTC,因此与预期时区的年、月和日元素不同。

    如果你想防止它们发生变化,你实际上只有两个选项来处理仅限日期的值:

    • 您的第一个选项是使用 Date 对象,但将输入视为 UTC,并且仅使用基于 UTC 的函数。例如:

      var dt = new Date(Date.UTC(2002, 0, 1));  // "2002-01-01T00:00:00.000Z"
      
      var y = dt.getUTCFullYear();  // 2002
      var m = dt.getUTCMonth() + 1; // 1
      var d = dt.getUTCDate();      // 1
      
      var dtString = d.toISOString().substring(0, 10) // "2002-01-01"
      
      • 如果您需要解析日期字符串,请注意 当前 ECMAScript 规范将仅日期值视为 UTC(这是您想要的),但在过去这种行为是未定义的。因此,某些浏览器可能会从new Date('2002-01-01') 创建本地时间结果。为了安全起见,您可能需要明确添加时间和Z,如new Date('2002-01-01' + 'T00:00:00.000Z')

      • 如果您打算使用 date-fns,请小心 - parseISOformatISO 函数使用 本地时间,而不是 UTC。

    • 第二个选项是使用Date 对象。将日期保留为字符串形式(采用 ISO 8601 yyyy-mm-dd 格式),或者将它们保留在您自己构建的不同对象或库中。

    ECMAScript TC39 Temporal proposal 旨在修复 JavaScript 中的此类缺陷。特别是,Temporal.Date 对象(初始名称)将能够用于仅日期值,而不会遇到您和其他许多人遇到的移位问题。该提案目前处于 ECMAScript 流程的第 2 阶段,因此今天无法使用,但这个问题最终会得到解决!

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      相关资源
      最近更新 更多