【问题标题】:Luxon.js ISO 8601 parsingLuxon.js ISO 8601 解析
【发布时间】:2019-08-26 05:01:27
【问题描述】:

我正在使用 Luxon.js 来处理 Date 并且我正在尝试解析一些来自服务器的 ISO 字符串。它有这种格式

2019-04-04T12:12:07+03:00

我正在使用 Luxon 的方法 - fromISO 应该解析这个 str

DateTime.fromISO("2019-04-04T12:12:07+03:00", "dd LLLL yyyy")

我预计会在输出中看到 2019 年 4 月 4 日 - 15:12,但它会返回 2019 年 4 月 4 日 - 12:12 em> 不知何故,我不明白为什么会这样?

我做错了吗? 因为当我尝试使用这个 ISO 字符串 2019-04-04T12:12:07.756Z 它就像一个魅力。但我不明白为什么前一个不起作用,我应该怎么做才能使它起作用?

我将不胜感激!

附:老实说,我对 ISO 时间的了解有些不足,如果这个问题很愚蠢,我很抱歉。

【问题讨论】:

  • 您的起始时间戳位于“+3:00”时区,比 UTC 早三个小时。该时区的 12:12:07 是 09:12:07 UTC。
  • 感谢@Pointy 的回答。让我们澄清一下。假设我的时区是 UTC+3。这个字符串也是如此 2019-04-04T12:12:07+03:00 意味着这条记录是在 12.12 完成的,我应该增加 3 小时(它将是 15.12)或者这意味着它是在我的时间 15.12 创建的,而 ISO 只是减去了这 3 个小时?为什么这个字符串 2019-04-04T12:12:07.756Z 被正确解析了?
  • 对,如果您在 +3:00 时区,那么 创建 日期会为您提供 UTC 日期 3 小时 。将其转换回字符串形式(显然)使用本地时区,因此增加了 3 小时。 (我同意考虑时区真的很令人困惑!)
  • 是的,你是对的。这有点烦人。感谢 Pointy 的详细解释。我仍然对 Luxon 解析以及为什么它在一种情况下有效但在不同情况下无效但至少现在我清楚地了解如何解析它。非常感谢。
  • @Velidan——你的问题不在于解析,而在于格式。正如Pointy所说,时间戳的时间分量是“12:12:07+03:00”,即+3时区的12:12:07。如果您在时区 +3,那么时间将是“12:12:07”,这就是您所得到的。要获得 15:12,您需要处于 +6 时区。

标签: javascript date iso8601 luxon


【解决方案1】:

2019-04-04T12:12:07+03:00 说“在偏移量为 +3 的区域中,它是 12:12”。它并没有告诉 Luxon 增加 3 小时;它提供了表达时间的背景。例如,因为偏移量为 +3 的区域的当地时间比 UTC 早 3 小时(这就是它的意思),所以在英格兰是 9:12。关键是它是地球上的一个特定时间,+3 只是告诉你使用什么规则将那个时间变成一个字符串。

Luxon 接收所有这些信息并计算出它的真实时间,在它的时间概念中,这是自 1970 年初以来在 UTC 中发生的毫秒数。然后它可以将其转换为任何区域的本地时间。当然,如果您的计算机位于偏移量为 +3 的区域中,则本地时间为 12:12:

-> TZ=Europe/Moscow node
> DateTime = require("luxon").DateTime
[Function: DateTime]
> var dt = DateTime.fromISO("2019-04-04T12:12:07+03:00")
undefined
> dt.toLocaleString(DateTime.TIME_24_SIMPLE)
'12:12'

我的电脑实际上在美国东海岸,所以我看到的当地时间有很大不同:

-> node
> DateTime = require("luxon").DateTime
[Function: DateTime]
> var dt = DateTime.fromISO("2019-04-04T12:12:07+03:00")
undefined
> dt.toLocaleString(DateTime.TIME_24_SIMPLE)
'05:12'

那是因为我的偏移量是-4,也就是说这里的当地时间比原字符串中的+3早了7个小时。

如果我的电脑在任何区域,我当然可以告诉 Luxon 在任何其他区域表达日期:

> dt.toUTC().toLocaleString(DateTime.TIME_24_SIMPLE)
'09:12'
> dt.setZone("Europe/Moscow").toLocaleString(DateTime.TIME_24_SIMPLE)
'12:12'
> dt.setZone("Asia/Tokyo").toLocaleString(DateTime.TIME_24_SIMPLE)
'18:12'

【讨论】:

  • 感谢您的详细解释。现在我清楚了
猜你喜欢
  • 2013-05-14
  • 2012-04-20
  • 1970-01-01
  • 2014-07-16
  • 2020-09-08
  • 2011-06-17
  • 2021-01-17
  • 2020-11-24
  • 2014-08-16
相关资源
最近更新 更多