Ответ 1
var timedifference = new Date(). getTimezoneOffset();
Это возвращает разницу с часовым поясом клиентов из UTC. Вы можете играть с ним, как вам нравится.
Каков наилучший способ получить часовую зону клиента и преобразовать ее в другой часовой пояс при использовании moment.js и moment-timezone.js
Я хочу узнать, что такое часовой пояс для клиентов, а затем преобразовать его дату и время в другой часовой пояс.
Есть ли у кого-нибудь опыт?
var timedifference = new Date(). getTimezoneOffset();
Это возвращает разницу с часовым поясом клиентов из UTC. Вы можете играть с ним, как вам нравится.
При использовании moment.js используйте:
var tz = moment.tz.guess();
Он возвратит идентификатор часового пояса IANA, например America/Los_Angeles
для тихоокеанского часового пояса США.
Внутренне он сначала пытается получить часовой пояс из браузера, используя следующий вызов:
Intl.DateTimeFormat().resolvedOptions().timeZone
Если вы ориентируетесь только на современные браузеры, которые поддерживают эту функцию, и вам не нужен Moment-Timezone для чего-то еще, то вы можете просто вызвать это напрямую.
Если Moment-Timezone не получает действительный результат от этой функции, или если эта функция не существует, то он будет "угадывать" часовой пояс, проверяя несколько различных дат и времени с объектом Date
чтобы увидеть, как он себя ведет. Предположение обычно является достаточно хорошим приближением, но не всегда точно соответствует настройке часового пояса компьютера.
При использовании 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()
}
Вы также можете получить желаемое время, используя следующий код JS:
new Date('${post.data.created_at} GMT+0200')
В этом примере мои полученные даты были в часовом поясе GMT + 0200. Вместо него может быть каждый часовой пояс. И возвращенные данные будут датой в вашем часовом поясе. Надеюсь, это поможет кому-нибудь сэкономить время
Используя библиотеку 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