Pobierz strefę czasową klienta z przeglądarki [duplikat]
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
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
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 .
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ą.)
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.]}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"
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()));
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 toD
dla DST iS
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>
.
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));
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?
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