Получение часового пояса (и смещения) клиента в JavaScript
Как мне получить информацию о часовом поясе посетителя?
Мне нужно следующее:
- сам часовой пояс (например, Europe/London);
- смещение от UTC или GMT (например, UTC+01).
5 ответ(ов)
Редактирование 19-03-2022 - ПРЕДУПРЕЖДЕНИЕ: Я больше не рекомендую этот подход, так как у него есть проблемы с несколькими браузерами и локалями.
Понимаю, что этот ответ немного отклоняется от темы, но, возможно, многие из нас, ищущие ответ, также хотят отформатировать часовой пояс для отображения и, возможно, получить аббревиатуру зоны. Итак, вот решение...
Если вам нужно красиво отформатировать часовой пояс клиента, вы можете использовать метод JavaScript Date.toString()
:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Это даст вам, например, "GMT-0400 (EST)", включая минуты часового пояса, если это применимо.
В качестве альтернативы, с помощью регулярных выражений вы можете извлечь любую желаемую часть:
Для "GMT-0400 (EDT)":
console.log(new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]);
Для "GMT-0400":
console.log(new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]);
Для просто "EDT":
console.log(new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]);
Для просто "-0400":
console.log(new Date().toString().match(/([-\+][0-9]+)\s/)[1]);
Справка по Date.toString
: MDN
Редактирование 06/10/2020 - Вышеуказанное решение может не работать во всех браузерах и локалях. Если это возможно в вашем сценарии, я рекомендую использовать библиотеки JavaScript, такие как date-fns, luxon или dayjs, которые предоставляют поддержку часовых поясов.
Уже был дан ответ на вопрос о том, как получить смещение в минутах в виде целого числа, но если кто-то хочет получить локальное GMT-смещение в виде строки, например "+1130"
, то можно использовать следующий код:
function pad(number, length) {
var str = "" + number;
while (str.length < length) {
str = '0' + str;
}
return str;
}
var offset = new Date().getTimezoneOffset();
offset = ((offset < 0 ? '+' : '-') + // Обратите внимание, знак смещения перевернут!
pad(parseInt(Math.abs(offset / 60)), 2) +
pad(Math.abs(offset % 60), 2));
Этот код создает строку с текущим смещением от GMT в виде "+hhmm"
, где hh
– часы, а mm
– минуты. Обратите внимание, что метод getTimezoneOffset()
возвращает смещение в минутах, и его знак обратный тому, что вы ожидаете, поэтому мы инвертируем знак, чтобы получить правильную строку.
Вы можете использовать:
moment-timezone
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// Получить часовой пояс по имени (например, "America/Chicago")
moment.tz.guess();
Определение часового пояса браузера может быть довольно сложной задачей, так как браузеры предоставляют ограниченную информацию.
Библиотека Moment Timezone использует методы Date.getTimezoneOffset()
и Date.toString()
для нескольких моментов времени вблизи текущего года, чтобы собрать как можно больше информации о среде браузера. Затем она сравнивает эту информацию с загруженными данными о всех часовых поясах и возвращает ближайшее соответствие. В случае ничьей возвращается часовой пояс с городом с самой большой популяцией.
console.log(moment.tz.guess()); // America/Chicago
Попробуйте использовать метод getTimezoneOffset()
объекта Date
:
var curdate = new Date();
var offset = curdate.getTimezoneOffset();
Этот метод возвращает смещение часового пояса в минутах, которое представляет разницу между GMT и местным временем в минутах.
В приведенном вами коде на JavaScript используется объект Date
, чтобы получить смещение часового пояса относительно UTC и преобразовать его в часы. Давайте разберём код построчно:
var d = new Date(); // Создаём новый объект Date, который содержит текущее время и дату
var n = d.getTimezoneOffset(); // Получаем смещение часового пояса в минутах
var timezone = n / -60; // Преобразуем смещение из минут в часы (умножаем на -1 для изменения знака)
console.log(timezone); // Выводим текущее смещение часового пояса в часах
Объяснение:
getTimezoneOffset()
возвращает разницу в минутах между UTC и локальным временем. Например, если ваше местное время на 3 часа впереди UTC, метод вернет-180
, так как разница будет отрицательной.- Деление на
-60
переводит минуты в часы. Например,-180 / -60
даст3
, что соответствует 3 часам.
Таким образом, данный код выводит текущее смещение вашего часового пояса относительно UTC в часах. Если у вас имеются дополнительные вопросы по этому коду или связанным темам, не стесняйтесь задавать!
Moment.js: Преобразование в объект даты
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"