Czy istnieje niezawodny sposób na pobranie strefy czasowej z przeglądarki klienta? Widziałem następujące linki, ale chcę solidniejszego rozwiązania.
Automatyczne wykrywanie strefy czasowej za pomocą JavaScript
javascript
http
browser
timezone
konfucjusz
źródło
źródło
Odpowiedzi:
Spójrz na to repozytorium pageloom warto
pobierz jstz.min.js i dodaj funkcję do swojej strony html
i wywołaj tę funkcję ze swojego tagu display
źródło
Intl.DateTimeFormat().resolvedOptions().timeZone
(bez IE11) zgodnie z sugestią Wallace'a.Pół dekady później mamy na to wbudowany sposób! W przypadku nowoczesnych przeglądarek użyłbym:
Zwraca łańcuch stref czasowych IANA, ale nie zwraca przesunięcia . Dowiedz się więcej w źródłach MDN .
Tabela zgodności - od marca 2019 r. Działa dla 90% przeglądarek używanych na całym świecie. Nie działa w przeglądarce Internet Explorer .
źródło
Intl.DateTimeFormat().resolvedOptions().timeZone
->undefined
Intl.DateTimeFormat().resolvedOptions().timeZone
zwróci oczekiwaną wartość, zaczynając od przeglądarki Firefox 52: kangax.github.io/compat-table/esintl/…Często, gdy ludzie szukają „stref czasowych”, wystarczy tylko „przesunięcie czasu UTC”. np. 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ętą z UTC.Warto zwrócić uwagę na ewentualne „gotcha” w znaku
getTimezoneOffset()
zwracanej wartości (z dokumentacji MDN) :Zalecam jednak używanie pliku day.js dla kodu JavaScript związanego z czasem / datą. W takim przypadku możesz uzyskać przesunięcie czasu UTC w formacie ISO 8601, uruchamiając:
Zapewne warto wspomnieć, że klient może łatwo sfałszować te informacje.
(Uwaga: ta odpowiedź początkowo zalecała https://momentjs.com/ , ale dayjs jest bardziej nowoczesną, mniejszą alternatywą.)
źródło
Na razie najlepszym rozwiązaniem jest prawdopodobnie jstz, zgodnie z sugestią mbayloon .
Dla kompletności należy wspomnieć, że na drodze jest standard: Intl . Możesz to już zobaczyć w Chrome:
(W rzeczywistości nie jest to zgodne ze standardem, co jest kolejnym powodem, aby trzymać się biblioteki)
źródło
Intl
mają powrócićundefined
dotimeZone
własności, jeśli nie ręcznie określić strefę czasową przy konstruowaniuDateTimeFormat
. Chrome odbiega od standardu, zwracając zamiast tego strefę czasową systemu; to właśnie wykorzystuje odpowiedź Johannesa, ale także powód, dla którego powiedział „tak naprawdę nie spełnia standardów”.możesz użyć strefy czasowej momentu, aby odgadnąć strefę czasową:
źródło
Oto plik jsfiddle
Zawiera skrót aktualnej strefy czasowej użytkownika.
Oto przykładowy kod
źródło
May 22 2015 03:45 PM CDT
, jak użyłemconsole.log(moment(now).format('MMM DD YYYY hh:mm A') + ' ' + moment.tz.zone(tz.name()).abbr(now.getTime()));
Użyłem podejścia podobnego do tego zastosowanego przez Josha Frasera , który określa przesunięcie czasu przeglądarki od UTC i czy rozpoznaje czas letni, czy nie (ale nieco uproszczony z jego kodu):
Po załadowaniu
ClientTZ.getBrowserTZ()
wykonywana jest funkcja, która ustawia:ClientTZ.UTCoffset
do przesunięcia czasu przeglądarki w stosunku do UTC w minutach (np. CST wynosi -360 minut, co stanowi -6,0 godzin od UTC);ClientTZ.UTCoffsetT
do offsetu w postaci'±hhmmD'
(np.,'-0600D'
), gdzie przyrostek oznaczaD
DST iS
standard (inny niż DST);ClientTZ.hasDST
(na prawdę lub fałsz).Wartość
ClientTZ.UTCoffset
jest podawana w minutach zamiast w godzinach, ponieważ niektóre strefy czasowe mają ułamkowe przesunięcia godzinowe (np. +0415).Zamiarem
ClientTZ.UTCoffsetT
jest użycie go jako klucza do tabeli stref czasowych (nie podano tutaj), na przykład<select>
listy rozwijanej .źródło
7-1
lipca zamiast czerwca. Nie jestem pewien, czy to naprawdę robi różnicę, ponieważ wątpię, czy istnieją regionalne schematy czasu letniego, które nie obejmują czerwca.Nie. Nie ma jednego niezawodnego sposobu i nigdy nie będzie. Czy naprawdę sądziłeś, że możesz zaufać klientowi?
źródło