Получить часовой пояс от браузера пользователей с помощью момента (часовой пояс).js

Каков наилучший способ получить часовую зону клиента и преобразовать ее в другой часовой пояс при использовании moment.js и moment-timezone.js

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

Есть ли у кого-нибудь опыт?

Ответ 1

var timedifference = new Date(). getTimezoneOffset();

Это возвращает разницу с часовым поясом клиентов из UTC. Вы можете играть с ним, как вам нравится.

Ответ 2

При использовании moment.js используйте:

var tz = moment.tz.guess();

Он возвратит идентификатор часового пояса IANA, например America/Los_Angeles для тихоокеанского часового пояса США.

Это задокументировано здесь.

Внутренне он сначала пытается получить часовой пояс из браузера, используя следующий вызов:

Intl.DateTimeFormat().resolvedOptions().timeZone

Если вы ориентируетесь только на современные браузеры, которые поддерживают эту функцию, и вам не нужен Moment-Timezone для чего-то еще, то вы можете просто вызвать это напрямую.

Если Moment-Timezone не получает действительный результат от этой функции, или если эта функция не существует, то он будет "угадывать" часовой пояс, проверяя несколько различных дат и времени с объектом Date чтобы увидеть, как он себя ведет. Предположение обычно является достаточно хорошим приближением, но не всегда точно соответствует настройке часового пояса компьютера.

Ответ 3

При использовании moment.js, moment(date).utcOffset() возвращает разницу во времени в минутах между временем браузера и UTC на дату, переданную в качестве аргумента (или на сегодняшний день, если дата не указана).
НЕ устанавливайте эту разницу в переменной и используйте ее для выбранной даты:

// this is WRONG! don't do it like this!
const OFFSET_UTC = moment().utcOffset();

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

Вот функция для анализа правильного смещения на выбранную дату:

function getUtcOffset(date) {
  return moment(date)
    .add(
      moment(date).utcOffset(), 
      'minutes')
    .utc()
}

Ответ 4

Вы также можете получить желаемое время, используя следующий код JS:

new Date('${post.data.created_at} GMT+0200')

В этом примере мои полученные даты были в часовом поясе GMT + 0200. Вместо него может быть каждый часовой пояс. И возвращенные данные будут датой в вашем часовом поясе. Надеюсь, это поможет кому-нибудь сэкономить время

Ответ 5

Используя библиотеку Moment, смотрите их веб-сайт → https://momentjs.com/timezone/docs/#/using-timezones/converting-to-zone/

я заметил, что они также используют свою собственную библиотеку на своем веб-сайте, так что вы можете попробовать использовать консоль браузера перед установкой

moment().tz(String);

The moment#tz mutator will change the time zone and update the offset.

moment("2013-11-18").tz("America/Toronto").format('Z'); // -05:00
moment("2013-11-18").tz("Europe/Berlin").format('Z');   // +01:00

This information is used consistently in other operations, like calculating the start of the day.

var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.format();                     // 2013-11-18T11:55:00-05:00
m.startOf("day").format();      // 2013-11-18T00:00:00-05:00
m.tz("Europe/Berlin").format(); // 2013-11-18T06:00:00+01:00
m.startOf("day").format();      // 2013-11-18T00:00:00+01:00

Without an argument, moment#tz returns:

    the time zone name assigned to the moment instance or
    undefined if a time zone has not been set.

var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.tz();  // America/Toronto
var m = moment.tz("2013-11-18 11:55");
m.tz() === undefined;  // true