【问题标题】:How Javascript Date.parse() handle timezone with UTC format?Javascript Date.parse() 如何处理 UTC 格式的时区?
【发布时间】:2020-12-25 01:48:20
【问题描述】:

为了管理我使用 React native 开发的移动应用程序的不同时区日期,我的 API 存储在数据库中并以 UTC 格式返回日期,如下所示:2020-09-06T11:07:12.647084Z

我以为我有一个特定的程序要做,通过 React Native Localize 包和 rnlocalize.getTimeZone() 方法将手机的时区发送给 API,以便 API 可以轻松处理日期,但我意识到只需将日期传递给原生 Javascript 中 Date 对象的 parse 方法中的 UTC 格式,以一种神奇的方式完全处理了不同的时区。

所以,由于我不喜欢魔法,所以我想知道 Javascript 如何检测手机的时区以及以下代码在内部实际上是如何工作的:

Date.parse("2020-09-06T11:07:12.647084Z")

使用此代码,如果我将手机时区更改为 America/New_York 或 Europe/Brussel,则日期每次都有效,并且对于创建的同一主题,无论时区如何,它都会告诉我“4 分钟前” .

如果 Javascript 管理时区,那么使用 React Native Localize 有什么意义,更重要的是,哪个更可靠?

【问题讨论】:

  • UTC 不是一种格式,它是一种时间标准。 “2020-09-06T11:07:12.647084Z”是 ISO 8601 格式。虽然 ECMA-262 确实支持 very similar format,但不支持小数秒中的额外 3 位数字,因此解析取决于实现。
  • "2020-09-06T11:07:12.647084Z" 代表 UTC 时间的特定时刻,因此无论设备的时区如何,它始终是同一时间之前以及您的行为重新看到是预期的。也就是说,如果对于纽约的用户来说是 4 分钟前,那么对于世界各地的每个人来说也是 4 分钟前(这就是使用 UTC 的意义,它是一个通用时间标准)。但是,如果您要显示当地时间,那么对于具有不同偏移量的时区,有所不同。
  • 感谢您的回答!然而,我忘记了一个很大的细节,当我说它显示在“4 分钟前”的屏幕上时,那是因为那是我需要显示的。另一方面,如果我记录我正在处理的日期以显示“4 分钟前”,那么实际上是已更改的日期。我还不如直接打印当地日期,它会显示纽约的 2020-09-06 07:00 和布鲁塞尔的 2020-09-06 13:00,实际上这部分看起来“神奇”我。
  • 感谢有关 UTC 的精确性,看到我一直放弃“UTC 格式”这个词一定很有趣 :)

标签: javascript react-native date datetime timezone


【解决方案1】:

Date.parse 有一些不一致的行为(参见第二段here),因为实现方式不同。如果您使用所有受支持的浏览器以及您可能存储的所有日期格式进行彻底测试,则可以在这里使用。本机功能的优势在于它不需要任何额外的脚本。

该库的最大优点是它会为您处理不一致的问题。看起来本地化库还有许多其他有用的功能,您的应用程序可能需要也可能不需要这些功能。使用该库将有助于以更加独立于浏览器的方式维护行为,但它确实需要额外的脚本。

我的建议是使用该库。它将使您的网站更加一致地工作,并且(不知道您的应用程序正在做什么)我不希望额外脚本的下载会引起注意。

【讨论】:

  • 虽然您关于 Date.parse 的 cmets 是正确的,但这不是 OP 的问题。 “问题”是没有问题,OP正在看到预期的行为。在一个地方 4 分钟前的特定时间 UTC 将在每个地方 4 分钟前。时区只是使用 UTC 以外的偏移量显示实际日期和时间的问题。可以使用内置的Intl.DateTimeFormat constructor,所以库可能很方便但不是必需的。
猜你喜欢
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2016-12-14
  • 2020-12-17
  • 1970-01-01
相关资源
最近更新 更多