Подтвердить что ты не робот

Такая же дата в другом часовом поясе

Мой вопрос: как я могу получить один и тот же день, месяц, год, час, минуты, секунды в другом часовом поясе, например:

var now = moment().valueOf();
var result1 = moment(now).format('DD-MM-YYYY HH:mm:SS Z');

В моем часовом поясе я получаю следующее:

18-02-2015 21:08:34 +01:00

Итак, как я могу изменить только часовой пояс без изменения других значений (дней, месяцев,..., минут,...)

Я хочу получить что-то вроде этого:

    result2: 18-02-2015 21:08:34 +01:00
    result3: 18-02-2015 21:08:34 +10:00
    result4: 18-02-2015 21:08:34 +05:00
    result5: 18-02-2015 21:08:34 -06:00
    result6: 18-02-2015 21:08:34 -11:00

Заранее спасибо

4b9b3361

Ответ 1

Вот как вы можете сделать то, что вы просите:

// get a moment representing the current time
var now = moment();

// create a new moment based on the original one
var another = now.clone();

// change the offset of the new moment - passing true to keep the local time
another.utcOffset('+05:30', true);

// log the output
console.log(now.format());      // "2016-01-15T11:58:07-08:00"
console.log(another.format());  // "2016-01-15T11:58:07+05:30"

Тем не менее, вы должны признать две важные вещи:

  • another объект больше не представляет текущее время - даже в целевом часовом поясе. Это совершенно другой момент времени. (Мир не синхронизирует локальные часы. Если бы это произошло, нам бы не понадобились часовые пояса!).

    По этой причине, хотя приведенный выше код удовлетворяет заданному вопросу, я настоятельно рекомендую не использовать его. Вместо этого переоцените ваши требования, так как, скорее всего, они неправильно понимают природу часовых поясов и часовых поясов.

  • Часовой пояс не может быть полностью представлен одним смещением. Прочитайте "Часовой пояс! = Смещение" в теге часового пояса вики. Хотя некоторые часовые пояса имеют фиксированные смещения (например, +05: 30, используемый Индией), многие часовые пояса меняют свои смещения в разных точках в течение года, чтобы приспособиться к переходу на летнее время.

  • Если вы хотите учесть это, вы можете использовать момент-часовой пояс вместо вызова utcOffset(...). Тем не менее, проблема в моей первой пуле будет по-прежнему применима.

// get a moment representing the current time
var now = moment();

// create a new moment based on the original one
var another = now.clone();

// change the time zone of the new moment - passing true to keep the local time
another.tz('America/New_York', true); // or whatever time zone you desire

// log the output
console.log(now.format());      // "2016-01-15T11:58:07-08:00"
console.log(another.format());  // "2016-01-15T11:58:07-05:00"

Ответ 2

Ответ с наибольшим количеством голосов - грязное ИМО. Здесь более чистое решение - похоже на ответ BlueSam, но безопаснее:

const myTime = moment.tz('2016-08-30T22:00:00', moment.ISO_8601, 'America/Denver')

myTime.format() //2016-08-30T22:00:00-06:00

const sameTimeDifferentZone = moment.tz(myTime.format('YYYY-MM-DDTHH:mm:ss.SSS'), moment.ISO_8601, 'America/New_York')

sameTimeDifferentZone.format() //2016-08-30T22:00:00-04:00

Ответ 3

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

var newTimezone = 'America/Denver';

//date - contains existing moment with timezone i.e 'America/New_York'
moment.tz(date.format('YYYY-MM-DDTHH:mm:ss'), 'YYYY-MM-DDTHH:mm:ss', newTimezone);

Ответ 4

С момента, когда документы: http://momentjs.com/timezone/docs/

указать момент-часовой пояс-с-data.js и указать, какой часовой пояс идти, например:

moment(date).tz("America/Los_Angeles").format()