Преобразование даты, времени и смещения в ISO8601 DateTime с использованием момента. js и момента времени - PullRequest
2 голосов
/ 17 апреля 2020

Я обрабатываю некоторые маршрутные данные, в которых все время и даты указаны в местном часовом поясе. Я добавляю эти данные в базу данных, где я хотел бы хранить все даты в формате UT C с правильным смещением часового пояса. Я пытаюсь обработать эти даты с моментом. js.

Строка ввода для даты / времени отформатирована следующим образом 2020-07-12 13:00, а часовой пояс имеет формат Europe/Amsterdam.

Я хочу получить строку типа:

2020-07-12T11:00:00+02:00

Проблема, с которой я столкнулся, заключается в том, что в этот момент мое время ввода переводится либо в местное время, либо в ut c если я использую метод .utc().

Этот код дает мне правильный результат, но я не понимаю, почему, и я не уверен, могу ли я положиться на его точность:

var offset = moment.tz(`Europe/Amsterdam`).utcOffset();
var m = moment(`2020-07-12 13:00`, 'YYYY-MM-DD HH:mm').utc().subtract(240 + offset + offset, 'minutes').utcOffset(offset); // (240 is my own UTC offset)

Как я могу просто ввести дату, время и часовой пояс и получить правильный ISO8601 DateTime?

1 Ответ

1 голос
/ 17 апреля 2020

Если вы уже используете Moment и Moment-TimeZone в своем приложении, то вы можете просто сделать следующее:

const m = moment.tz('2020-07-12 13:00', 'YYYY-MM-DD HH:mm', 'Europe/Amsterdam');
m.format() //=> "2020-07-12T13:00:00+02:00"

Однако команда Moment рекомендует использовать Luxon для новых развитие. Эквивалент:

const dt = luxon.DateTime.fromFormat('2020-07-12 13:00', 'yyyy-MM-dd HH:mm', { zone: 'Europe/Amsterdam'});
dt.toISO()  //=> "2020-07-12T13:00:00.000+02:00"

Единственное отличие состоит в том, что включены миллисекунды. Вы можете использовать другую функцию форматирования, если вы предпочитаете другой вывод.

Основное преимущество Luxon состоит в том, что он использует встроенную функциональность часового пояса, предоставляемую API интернационализации ECMAScript, тогда как Moment-Timezone связывает свой собственный данные о часовом поясе - которые могут быть довольно большими.

Также обратите внимание, что, задавая вопрос 2020-07-12T11:00:00+02:00, вы задаете вопрос о том, что вы неправильно понимаете формат ISO 8601. В этом формате время составляет местное время. Таким образом, это должно быть 13:00, а не 11:00. +02:00 означает, что «это было смещение от UT C для этого местного времени ». (Это не означает, что вы применяете смещение для получения местного времени.)

...