Moment.js: формат даты в определенном часовом поясе

Я использую 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.

9 ответов

Решение

Как указано в ответе Манто, .utcOffset()является предпочтительным методом с момента 2.9.0. Эта функция использует реальное смещение от UTC, а не обратное смещение (например, -240 для Нью-Йорка во время летнего времени). Смещенные строки типа "+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 для Нью-Йорка во время летнего времени).

// 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 и используйте .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')

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

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, это может привести к непредсказуемому поведению


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

В

Если у вас есть отметка времени, разделенная на «T», сначала вам необходимо использовать метод utc. Вот как я преобразовал временную метку из UTC в EST/EST:

      let createdDate = moment.utc("2023-06-11T00:45:48.42") 
moment(createdDate, "MM/DD/yy").tz("America/New_York").format("MM/DD/yy")}

Результат: 10.06.2023.

Ссылка: https://momentjs.com/timezone/docs/#/using-timezones/

Если вы передадите временную метку в качестве параметра moment()(например, если часовой пояс Азия/Гонконг, что составляет +08:00), я делаю следующее:

      const localDateTime = moment((item.createdAt.seconds + 8 * 3600) * 1000).format('YYYY-MM-DD HH:mm:ss');

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

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

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

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

Ура!!

Другие вопросы по тегам