Форматировать дату в определенном часовом поясе

Я использую Moment.js для разбора и форматирования дат в своем веб-приложении. Как часть объекта JSON, мой внутренний сервер отправляет даты в виде количества миллисекунд от эпохи UTC (смещение Unix).

Разбор дат в определенном часовом поясе прост - просто добавьте идентификатор часового пояса RFC 822 в конец строки перед анализом:

// response varies according to your timezone
moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")

// problem solved, always "03/11 17:00"
moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")

Но как мне отформатировать дату в определенном часовом поясе?

Мне нужны постоянные результаты независимо от текущего времени браузера, но я не хочу отображать даты в формате UTC.

Ответ 1

Как указано в ответе Манто, .utcOffset() является предпочтительным методом с момента 2.9.0. Эта функция использует реальное смещение от UTC, а не обратное смещение (например, -240 для Нью-Йорка во время DST). Смещение строк типа "+0400" работает так же, как и раньше:

// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')

Более старый .zone() в качестве сеттера был устаревшим в Moment.js 2.9.0. Он принял строку, содержащую идентификатор часового пояса (например, "-0400" или "-04: 00" в течение 4 часов) или число, отображающее минуты позади UTC (например, 240 для Нью-Йорка во время DST).

// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')

Чтобы работать с именованными часовыми поясами вместо числовых смещений, включите Moment Timezone и вместо этого используйте .tz():

// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')

Ответ 2

Использовать момент-время

moment(date).tz('Europe/Berlin').format(format)

Прежде чем вы сможете получить доступ к определенному часовому поясу, вам необходимо загрузить его так (или используя альтернативные методы, описанные здесь)

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')

Ответ 3

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

moment.tz(date, format, timezone)

moment(date, format).tz(timezone)

Предполагая, что часовой пояс не указан в дате, переданной в:

Первый код принимает дату и предполагает, что часовым поясом является тот, который был передан. Второй принимает дату, принимает часовой пояс из браузера, а затем изменяет время и часовой пояс в соответствии с переданным часовым поясом.

Пример:

moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z"

moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z"

Мой часовой пояс +5 от UTC. Таким образом, в первом случае он не изменяется и устанавливает дату и время для часового пояса utc.

Во втором случае он предполагает, что переданная дата находится в -5, затем превращает его в UTC, и именно поэтому он выплевывает дату "2018-07-18T00: 00: 00Z"

ПРИМЕЧАНИЕ. Параметр формата действительно важен. Если пропущенный момент может вернуться к классу Date, это может привести к непредсказуемому поведению


Предполагая, что часовой пояс указан в дате, переданной в:

В этом случае они оба ведут себя одинаково


Несмотря на то, что теперь я понимаю, почему это так, я подумал, что это довольно запутанная особенность, которую стоит объяснить.

Ответ 4

.zone() устарел, и вместо этого вы должны использовать utcOffset:

// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')

Ответ 5

У меня была такая же проблема с Moment.js. Я установил момент-часовой пояс, но проблема не была решена. Затем я сделал то, что здесь раскрыл, установил часовой пояс, и он работает как шарм:

moment(new Date({your_date})).zone("+08:00")

Спасибо большое!

Ответ 6

Просто пришло это, и, поскольку у меня была такая же проблема, я просто опубликовал результаты, которые я придумал

при синтаксическом анализе вы можете обновить смещение (т.е. я анализирую данные (1.1.2014), и мне нужна только дата, 1 января 2014. В GMT + 1 я получаю 31.12.2013. сначала.

moment(moment.utc('1.1.2014').format());

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

В

Ответ 7

Вы можете попробовать это,

Здесь вы можете получить дату на основе часового пояса клиента (браузера).

moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss')

Регулярное выражение в основном возвращает значение смещения.

Ура !!