Pobierz strefę czasową klienta z przeglądarki [duplikat]

to pytanie ma już odpowiedzi tutaj : uzyskanie strefy czasowej klienta (i przesunięcia) w JavaScript (28 odpowiedzi) Zamknięty 5 miesięcy temu .

Czy istnieje niezawodny sposób na uzyskanie strefy czasowej z przeglądarki klienta? Widziałem następujące linki, ale chcę bardziej solidne rozwiązanie.

Automatyczne wykrywanie strefy czasowej za pomocą JavaScript

Wykrywanie stref czasowych w JavaScript

Author: Aidan Ryan, 2011-08-04

9 answers

Spójrz na to repozytorium pageloom to jest pomocne

Pobierz jstz./ min.js i dodaj funkcję do swojej strony html

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

I wywołaj tę funkcję z twojego znacznika wyświetlania

 87
Author: Georgian Citizen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-21 12:53:45

Pół dekady później mamy na to wbudowany sposób! Dla nowoczesnych przeglądarek używałbym:

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

Zwraca łańcuch strefy czasowej IANA, ale nie przesunięcie . Dowiedz się więcej na MDN reference .

Tabela zgodności - od marca 2019 r. działa dla 90% przeglądarek używanych na całym świecie. nie działa na Internet Explorerze .

 232
Author: Wallace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-06 22:03:59

Często, gdy ludzie szukają "stref czasowych", wystarczy"przesunięcie UTC". Na przykład, ich serwer jest w UTC + 5 i chcą wiedzieć, że ich klient działa w UTC-8.


W zwykłym starym javascript (new Date()).getTimezoneOffset()/60 zwróci bieżącą liczbę godzin przesuniętych od UTC.

Warto zauważyć ewentualną "gotcha" w znaku getTimezoneOffset() return value (z MDN docs):

Przesunięcie strefy czasowej jest różnicą, w minutach, pomiędzy UTC i czasu lokalnego. Oznacza to, że przesunięcie jest dodatnie, jeśli lokalna Strefa czasowa znajduje się za UTC, a ujemne, jeśli jest przed nami. Na przykład dla strefy czasowej UTC+10: 00 (Australian Eastern Standard Time, Vladivostok Time, Chamorro Standard Time) zostanie zwrócone -600.


Polecam jednak skorzystać z dnia .js dla kodu Javascript związanego z czasem/datą. W takim przypadku można uzyskać przesunięcie UTC w formacie ISO 8601, uruchamiając:
> dayjs().format("Z")
"-08:00"

Prawdopodobnie nosi wspominając, że klient może łatwo sfałszować te informacje.

(Uwaga: Ta odpowiedź pierwotnie zalecana https://momentjs.com / , ale dayjs jest bardziej nowoczesną, mniejszą alternatywą.)

 78
Author: Chris W.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-13 19:00:54

Na razie najlepszym rozwiązaniem jest prawdopodobnie jstz, jak sugerowano w mbayloon ' s answer .

Dla kompletności należy wspomnieć, że istnieje norma na jej drodze: Intl . Można to już zobaczyć w Chrome:

> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"
Nie jest to zgodne ze standardem, co jest jeszcze jednym powodem, aby trzymać się biblioteki.]}
 51
Author: Johannes Hoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-04 00:29:39

Możesz użyć Strefa czasowa aby odgadnąć strefę czasową:

> moment.tz.guess()
"America/Asuncion"
 7
Author: Tomas Tomecek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 06:18:11

Oto jsfiddle

Zawiera skrót bieżącej strefy czasowej użytkownika.

Oto przykład kodu

var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));
 4
Author: Pushkar Newaskar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-04 21:47:10

Użyłem podejścia podobnego do tego, które zrobił Josh Fraser , które określa przesunięcie czasu przeglądarki od UTC i czy rozpoznaje DST, czy nie (ale nieco uproszczone z jego kodu):

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();

Po załadowaniu wykonywana jest funkcja ClientTZ.getBrowserTZ(), która ustawia:

  • Na przykład, CST jest -360 minut, czyli -6.0 godzin od UTC);
  • ClientTZ.UTCoffsetT do offsetu w postaci '±hhmmD' (np. '-0600D'), gdzie przyrostek to D dla DST i S Dla standard (non-DST);
  • ClientTZ.hasDST (to true or false).

ClientTZ.UTCoffset jest podawana w minutach zamiast godzin, ponieważ niektóre strefy czasowe mają ułamkowe przesunięcia godzinowe (np. +0415).

Intencją ClientTZ.UTCoffsetT jest użycie go jako klucza do tabeli stref czasowych( Nie podano tutaj), na przykład dla rozwijanej listy <select>.

 2
Author: David R Tribble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-28 18:59:03

Oto wersja, która działa dobrze we wrześniu 2020 przy użyciu fetch i https://worldtimeapi.org/api

fetch("https://worldtimeapi.org/api/ip")
  .then(response => response.json())
  .then(data => console.log(data.timezone,data.datetime,data.dst));
 2
Author: mplungjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-16 07:48:08

Nie. Nie ma jednego niezawodnego sposobu i nigdy nie będzie. Naprawdę myślałeś, że możesz zaufać klientowi?

 -16
Author: Florian Margaine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-12 13:53:01