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')
Регулярное выражение в основном возвращает значение смещения.
Ура!!