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

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

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

Обнаружение часового пояса в JavaScript

108 голосов | спросил confucius 4 PM00000020000005831 2011, 14:19:58

8 ответов


0

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

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

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

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

ответил Georgian Citizen 24 Jpm1000000pmTue, 24 Jan 2012 14:00:14 +040012 2012, 14:00:14
0

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

Intl.DateTimeFormat().resolvedOptions().timeZone

Это может не сработать для браузера, который вам требуется поддерживать , в этом случае я бы вернуться к одной из библиотек, представленных в предыдущих ответах.

Не работает в Firefox (51 и ниже) и IE https://developer.mozilla.org /EN-US /Docs /Web /JavaScript /Справка /Global_Objects /DateTimeFormat /resolvedOptions # Browser_compatibility

ответил Wallace 29 Maypm16 2016, 19:38:20
0

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


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

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

  

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


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

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

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

ответил Chris W. 23 Jpm1000000pmFri, 23 Jan 2015 22:15:37 +030015 2015, 22:15:37
0

На данный момент лучшая ставка - это, вероятно, jstz, как это предлагается в mbayloon's ответить .

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

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

(на самом деле это не соответствует стандарту, что является еще одной причиной придерживаться библиотеки)

ответил Johannes Hoff 8 +04002013-10-08T19:54:40+04:00312013bEurope/MoscowTue, 08 Oct 2013 19:54:40 +0400 2013, 19:54:40
0

Вот jsfiddle

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

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

var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));
ответил Pushkar Newaskar 3 J000000Thursday14 2014, 03:57:36
0

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

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's 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> список.

ответил David R Tribble 28 PMpThu, 28 Apr 2016 21:59:03 +030059Thursday 2016, 21:59:03
0

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

> moment.tz.guess()
"America/Asuncion"
ответил SummerBreeze 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 13 Sep 2016 09:18:11 +0300 2016, 09:18:11
0

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

ответил Florian Margaine 12 12012vEurope/Moscow11bEurope/MoscowMon, 12 Nov 2012 17:53:01 +0400 2012, 17:53:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132