Как конвертировать дату 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()
}
Другие вопросы по тегам