Разбор Luxon.js ISO 8601

Я использую Luxon.js для обработки Date, и я пытаюсь проанализировать некоторую строку ISO, которая приходит с сервера. Имеет этот формат

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

и я использую метод Люксона - от ISO, который должен разобрать эту стр

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

Я ожидаю увидеть 04 апреля 2019 - 15:12 в выходных данных, но он вернется 04 апреля 2019 - 12:12 как-то, и я не могу понять, почему это происходит?

Я делаю что-то неправильно? потому что когда я пытаюсь использовать эту строку ISO 2019-04-04T12:12:07.756Z она работает как шарм. Но я не понимаю, почему предыдущий не работает и что я должен сделать, чтобы он работал?

Я буду признателен за любую помощь!

PS Если честно, у меня есть некоторые пробелы в моих знаниях о времени ISO, поэтому извините, если вопрос глупый.

1 ответ

Решение

2019-04-04T12:12:07+03:00 говорит "в зоне со смещением +3, это 12:12". Это не говорит Luxon добавить 3 часа; это обеспечивает контекст, в котором было выражено время. Например, поскольку зоны с смещением +3 имеют местное время на 3 часа раньше UTC (вот что это значит), то в Англии это 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, что означает, что местное время здесь на 7 часов раньше, чем +3 в исходной строке.

Разместив мой компьютер в любой зоне, я, конечно, мог бы попросить 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'
Другие вопросы по тегам