Получить часовой пояс клиента из браузера

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

Автоматическое определение часового пояса с помощью JavaScript

Определение часового пояса в JavaScript

Ответ 1

Посмотрите на этот репозиторий pageloom полезно

загрузите jstz.min.js и добавьте функцию на страницу html

<script language="javascript">
    function getTimezoneName() {
        timezone = jstz.determine()
        return timezone.name();
    }
</script>

и вызовите эту функцию из вашего тега отображения

Ответ 2

Спустя пол десятилетия у нас есть встроенный способ для этого! Для современных браузеров я бы использовал:

const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);

Ответ 3

Часто, когда люди ищут "часовые пояса", достаточно просто "смещение UTC". например, их сервер находится в UTC + 5, и они хотят знать, что их клиент работает в UTC-8.


В простом старом javascript (new Date()).getTimezoneOffset()/60 вернет текущее количество часов смещения от UTC.

Стоит отметить возможную "погрешность" в знаке возвращаемого значения getTimezoneOffset() (из документов MDN):

Смещение часового пояса - это разница в минутах между UTC и местным временем. Обратите внимание, что это означает, что смещение является положительным, если локальный часовой пояс отстает от UTC, и отрицательным, если оно впереди. Например, для часового пояса UTC + 10: 00 (Стандартное восточное время Австралии, Владивостокское время, Стандартное время Чаморро) будет возвращено -600.


Однако я рекомендую вам использовать day.js для кода Javascript, относящегося ко времени/дате. В этом случае вы можете получить смещение UTC в формате ISO 8601, выполнив:

> dayjs().format("Z")
"-08:00"

Вероятно, стоит упомянуть, что клиент может легко подделать эту информацию.

(Примечание: этот ответ первоначально рекомендовал https://momentjs.com/, но Dayjs - более современная, более мелкая альтернатива.)

Ответ 4

На данный момент лучшим вариантом является, вероятно, jstz, как было предложено в ответе mbayloon.

Для полноты, следует упомянуть, что на нем есть стандарт: Intl. Вы уже видите это в Chrome:

> Intl.DateTimeFormat().resolved.timeZone
"America/Los_Angeles"

(Это фактически не соответствует стандарту, что является еще одной причиной для использования библиотеки)

Ответ 5

Вот jsfiddle

Он содержит аббревиатуру текущего часового пояса пользователя.

Вот пример кода

var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));

Ответ 6

Я использовал подход, похожий на тот, который был сделан Джошем Фрейзером, который определяет смещение времени браузера с UTC и распознает ли он DST или нет (но несколько упрощен из его кода):

var ClientTZ = {
    UTCoffset:  0,          // Browser time offset from UTC in minutes
    UTCoffsetT: '+0000S',   // Browser time offset from UTC in '±hhmmD' form
    hasDST:     false,      // Browser time observes DST

    // Determine browser timezone and DST
    getBrowserTZ: function () {
        var self = ClientTZ;

        // Determine UTC time offset
        var now = new Date();
        var date1 = new Date(now.getFullYear(), 1-1, 1, 0, 0, 0, 0);    // Jan
        var diff1 = -date1.getTimezoneOffset();
        self.UTCoffset = diff1;

        // Determine DST use
        var date2 = new Date(now.getFullYear(), 6-1, 1, 0, 0, 0, 0);    // Jun
        var diff2 = -date2.getTimezoneOffset();
        if (diff1 != diff2) {
            self.hasDST = true;
            if (diff1 - diff2 >= 0)
                self.UTCoffset = diff2;     // East of GMT
        }

        // Convert UTC offset to ±hhmmD form
        diff2 = (diff1 < 0 ? -diff1 : diff1) / 60;
        var hr = Math.floor(diff2);
        var min = diff2 - hr;
        diff2 = hr * 100 + min * 60;
        self.UTCoffsetT = (diff1 < 0 ? '-' : '+') + (hr < 10 ? '0' : '') + diff2.toString() + (self.hasDST ? 'D' : 'S');

        return self.UTCoffset;
    }
};

// Onload
ClientTZ.getBrowserTZ();

При загрузке выполняется функция ClientTZ.getBrowserTZ(), которая устанавливает:

  • ClientTZ.UTCoffset к смещению времени браузера с UTC в минутах (например, CST составляет -360 минут, что составляет -6,0 часа с UTC);
  • ClientTZ.UTCoffsetT к смещению в форме '±hhmmD' (например, '-0600D'), где суффикс D для DST и S для стандартного (не-DST);
  • ClientTZ.hasDST (true или false).

ClientTZ.UTCoffset предоставляется в минутах вместо часов, поскольку некоторые временные интервалы имеют дробные почасовые смещения (например, +0415).

Цель ClientTZ.UTCoffsetT - использовать его в качестве ключа в таблице часовых поясов (не указывается здесь), например, для раскрывающегося списка <select>.

Ответ 7

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

> moment.tz.guess()
"America/Asuncion"

Ответ 8

Нет. Нет единого надежного способа, и его никогда не будет. Вы действительно считали, что можете доверять клиенту?