Как конвертировать дату JavaScript в соответствии с новым часовым поясом
Я думал, что справлюсь с этим, но я не могу решить это.
сценарий:
1) пользователь выбирает виджет даты, который возвращает дату в местном часовом поясе, скажем, 10:00 "Австралия / Сидней"
2) Затем пользователь выбирает другой часовой пояс по идентификатору "Австралия / Брисбен" (это другой TZ и может иметь летнее время и т. Д.). Предположим, его +1 час.
То, что я хочу сделать, это иметь функцию, которая берет объект Date, который представляет [10:00 'Australia/Sydney'] и возвращает мне новую Date, которая представляет [10:00 'Australia/Brisbane], т.е. основное время UTC будет смещено на +1 час.
function convertToTimezone(date, newTimezone) {
... what goes here? ...
return newDate;
}
Я порхал с часовым поясом момента, и я не могу заставить его делать то, что я хочу.
2 ответа
moment-timezone
библиотека должна сделать это тривиальным:
function convertToTimezone(date, newTimezone) {
return moment(date).tz(newTimezone);
}
Или если date
уже moment
:
function convertToTimezone(date, newTimezone) {
return date.clone().tz(newTimezone);
}
См. Документацию по преобразованию в зону для получения дополнительной информации.
ОК, FWIW, я получил ответ сам. момент.тз не работает, как я себе представлял.
Подводя итог, я хочу взять javascript Date, который имеет время настенного часа, скажем, "10 утра 15 сентября 2018 года", который был связан с определенным идентификатором часового пояса, скажем, BrisabneOz.
И включите его в новую дату, которая представляет то же самое время настенного часа, но в другом часовом поясе. Другими словами, измените базовое время UTC на величину, необходимую для смены часовых поясов и / или перехода на летнее время и т. Д.
Я нашел способ сделать это, чтобы получить строку даты настенного часового режима, таким образом убрав любой связанный часовой пояс из уравнения tbe, и используя moment.tz, чтобы создать другой объект даты, используя новый другой часовой пояс. Что это может сделать.
Часть, которая смутила меня, заключалась в том, что мне нужно было перейти к строке в качестве шага - думал, что я могу просто пропустить одну дату и получить moment.tz, чтобы замаскировать меня на другую дату аля @Alex Taylor, но это на самом деле не работает.
function convertDateToTimezone(date, timezone) {
const str = moment(date).format('YYYY-MM-DD HH:mm:ss');
const tzMoment = moment.tz(str, timezone.identifier)
return tzMoment.toDate()
}