Момент.js: форматирование даты в определенном часовом поясе
Я использую момент.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.
7 ответов:
как указано в манто,
.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()как сеттер был устаревший в данный момент.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')
для работы с именованными часовыми поясами вместо числовых смещений включите Момент Часовой Пояс и использовать
.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(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")Спасибо большое!
просто пришел acreoss это, и так как у меня была та же проблема, я бы просто опубликовал результаты, которые я придумал
при разборе вы можете обновить смещение (т. е. я разбираю данные (1.1.2014), и мне нужна только дата, 1 января 2014 года. На GMT+1 я бы получил 31.12.2013. Поэтому я сначала компенсирую значение.
moment(moment.utc('1.1.2014').format());Ну, пригодился мне для поддержки в разных часовых поясах
B
в нескольких ответах уже упоминается, что moment-timezone-это способ пойти с названным часовым поясом. Я просто хочу прояснить кое-что об этой библиотеке, что было довольно запутанным для меня. Существует разница между этими двумя утверждениями:
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"
Примечание: параметр формат действительно важный. Если опущен момент может вернуться к классу даты, который может непредсказуемое поведение
предполагая, что часовой пояс указан в дате, переданной в:
в этом случае они оба ведут себя одинаково
хотя теперь я понимаю, почему это работает таким образом, я думал, что это довольно запутанная функция и стоит объяснить.
вы можете попробовать это ,
здесь вы можете получить дату на основе клиентского часового пояса (браузера).
moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss')регулярное выражение в основном получает значение смещения.
Ура!!
Comments