Moment: Можно ли сохранить внутренний часовой пояс?

Созданный на 4 окт. 2018  ·  3Комментарии  ·  Источник: moment/moment

Описание проблемы и шаги для воспроизведения:
Скажем, я получил дату от бэкэнда в таком формате:

"2018-10-10T13:00:00+11:00"

Что я ожидаю увидеть во фронтенде после парсинга и форматирования:

10-10-2018 1.00 PM

Что я имею:

10-10-2018 5.00 AM

Меня не волнует часовой пояс моей системы. Я тоже не хочу видеть время UTC. Как я могу достичь этого?

Пожалуйста, укажите значения всех используемых переменных.

См. выше.

Окружающая обстановка:

Это не имеет значения, это не должно зависеть от окружающей среды. Вот в чем проблема, кстати, потому что это зависит!

Самый полезный комментарий

Вы можете попробовать parseZone :

например, для местного часового пояса в BST (UTC + 1)

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"

Все 3 Комментарий

Afaik, момент по умолчанию использует часовой пояс устройства при форматировании даты (что также является стандартным поведением Javascript). Так что да, форматирование даты должно зависеть от среды. Например, на моем устройстве я получаю это для вашей даты, которая является правильным временем для моего местного времени (Окленд):

moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'

Если вы хотите установить часовой пояс по умолчанию для пользователя вручную, вы можете использовать moment-timezone с именем часового пояса IANA :

moment.tz.setDefault('America/New_York');

Это приведет к тому, что все форматирование будет выполнено для этого часового пояса и будет независимым от среды.

Вот ссылка на документы: https://momentjs.com/timezone/docs/#/using -timezones/default-timezone/


Невозможно узнать часовой пояс пользователя по смещению (поскольку несколько часовых поясов могут иметь одно и то же смещение, например, в зависимости от перехода на летнее время), но вы можете использовать имена зон Etc для «общих» зон, например Etc/GMT-11 в вашем случае (для этих зон знак перевернут). В вашем случае, вероятно, было бы более целесообразно сохранить часовой пояс пользователя в качестве настройки и сохранить его на сервере или сохранить вместе с отметкой времени.

Затем вы можете распечатать одну дату в определенном часовом поясе, используя, например,

moment.tz("2018-10-10T13:00:00+11:00", "America/New_York");

Спасибо, @simonhaenisch

Я видел плагин tz, но подумал, что он помогает управлять часовыми поясами, например конвертировать из одного в другой. И мне кажется странным использовать его только для того, чтобы вообще НЕ касаться часового пояса :)

Если вы хотите установить часовой пояс по умолчанию для пользователя вручную

К сожалению, на сервере нет часового пояса default . У каждого пользователя есть свой часовой пояс, сохраненный в профиле. И фронтенд ничего об этом не знает.

Невозможно узнать часовой пояс пользователя по смещению

Все в порядке, меня не волнует часовой пояс. Все, что мне нужно, это просто сохранить предстоящую дату без изменений.

сохраните часовой пояс пользователя в качестве параметра и сохраните его на сервере или сохраните его вместе с отметкой времени.

Именно это и происходит. Часовой пояс — это настройка, а дата сохраняется вместе с ней в качестве временной метки.

Поскольку внутренний API находится под моим контролем, я могу просто отправить сокращенную версию даты без смещения часового пояса. Я надеюсь, что это помогает.

Но очень интересно, почему в moment.js нет такого:

moment(somDateTime).format({ formatWithDeviceTimezone: true })

или вроде :)

Где formatWithDeviceTimezone по умолчанию является ложным.

В любом случае, спасибо, теперь я вижу проблему.

Вы можете попробовать parseZone :

например, для местного часового пояса в BST (UTC + 1)

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"
Была ли эта страница полезной?
0 / 5 - 0 рейтинги