Дата UTC с разным переходом на летнее время с поправкой на текущий часовой пояс

У меня есть даты, сохраненные в mongodb в формате UTC, например. "2016-01-28T00:00:00.000Z". В клиенте я использую moment.js для форматирования даты. Однако, когда я создал момент этой конкретной даты, в игру вступает летнее время:

>moment("2016-01-28T00:00:00.000Z").format()

"2016-01-27T19:00:00-05:00"

Если я использую часовой пояс момента для настройки этого времени, это не сработает, потому что смещение на данный момент равно -4, а не -5. Как правильно настроить это время, чтобы вместо 27.01.16 я получил 28.01.16, чего я и хочу. На данный момент я придумал одно решение, чтобы получить .utcOffset за минуты и добавить это к моменту моего времени:

moment("2016-01-28T00:00:00.000Z").add( -moment("2016-01-28T00:00:00.000Z").utcOffset(),'minutes').format()

"2016-01-28T00:00:00-05:00"

Однако я не уверен, что это лучший способ сделать это.


person thehme    schedule 20.05.2016    source источник
comment
У вас есть смещение во входных данных (Z, что для UTC и эквивалентно +00:00). См. ответ в посте с дублированием, чтобы понять, как использовать функцию parseZone, чтобы сохранить его, или функцию utc, чтобы использовать исключительно UTC.   -  person Matt Johnson-Pint    schedule 21.05.2016


Ответы (1)


Ознакомьтесь со спецификацией для ISO 8601, особенно в отношении обозначений часовых поясов.

«Z» в конце отформатированной входной строки обозначает, что число находится в часовом поясе UTC. Библиотека moment берет дату UTC и автоматически преобразует ее в местный часовой пояс, что в вашем случае означает вычитание нескольких часов.

Если вы уберете «Z», то moment будет интерпретировать его как «неопределенный» часовой пояс и не будет добавлять или вычитать какое-либо время из заданной даты и времени. Итак, обратите внимание:

> moment("2016-01-28T00:00:00.000Z").format()
< "2016-01-27T19:00:00-05:00"
> moment("2016-01-28T00:00:00.000").format()
< "2016-01-28T00:00:00-05:00"

После удаления «Z» moment по-прежнему будет форматировать новую дату с -05:00 в качестве обозначения часового пояса, но не будет изменять дату и время.

person devrelm    schedule 21.05.2016
comment
Извините, но это не очень хорошая идея. Хотя это может дать то же самое значение местного времени, вы фактически изменили назначение метки времени, поместив ее в другой момент времени. Смотрите ответ в дублирующей ссылке для правильного подхода. - person Matt Johnson-Pint; 21.05.2016