Luxon.js ISO 8601 解析

Luxon.js ISO 8601 parsing

我正在使用 Luxon.js 来处理日期,我正在尝试解析来自服务器的一些 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 但它 returns 2019 年 4 月 4 日 - 12:12 不知何故,我不明白为什么会这样?

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

我将不胜感激!

P.S。老实说,我对 ISO 时间的了解有些不足,如果这个问题很愚蠢,我深表歉意。

2019-04-04T12:12:07+03:00 表示 "in a zone with an offset of +3, it is 12:12"。它并没有告诉 Luxon 增加 3 小时;它只是告诉 Luxon。它提供了表达时间的上下文。例如,因为偏移量为 +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'

那是因为我的offset是-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'