Odpowiedz

8

Technicznie, jest bardziej poprawna zaklęcie:

Intl.DateTimeFormat().resolvedOptions().timeZone 

Niestety, nie wszystkie implementacje aktualnie obsługuje funkcji strefy czasowej Intl API. Tak więc, chociaż zwróci to prawidłową strefę czasową IANA w Chrome, nie będzie tego robić w FireFox i kilku innych przeglądarkach.

Funkcja kangax Intl compatibility table przedstawia tę funkcję jako podpozycję pod obiektem oznaczonym DateTimeFormat oznaczonym resolvedOptions().timeZone defaults to the host environment.

Zobacz następujące elementy robocze Firefox:

  • Bug 1158733 - Wykrywanie czasowej systemu z internacjonalizacji Javascript API
  • Bug 895737 - DateTimeFormat nie zapisuje aktualną strefę czasową
  • Bug 837961 - Dodaj wsparcie dla IANA strefy czasowej nazwy do internacjonalizacji API

W międzyczasie istnieją dwie opłacalne alternatywy s:

  • jsTimeZoneDetect - która koncentruje się wyłącznie na zgadywaniu strefy czasowej.
  • moment-timezone - która jest dodatkiem do popularnej biblioteki moment.js i zawiera API moment.tz.guess(), aby spróbować odgadnąć strefę czasową użytkownika.

Należy pamiętać, że oba te elementy będą wewnętrznie próbowały korzystać z interfejsu API Intl, jeśli jest on dostępny i działa, zanim spróbują zastosować dodatkowe algorytmy zgadywania.

Należy również pamiętać, że najlepszą praktyką jest nigdy nie polegać wyłącznie na wykrywaniu/zgadywaniu strefy czasowej, ale raczej użyciu go do wyboru rozsądnej wartości domyślnej z kontrolki wyboru strefy czasowej. Zawsze dawaj użytkownikowi sposób na wybranie wybranej strefy czasowej. Jest to ważne, ponieważ strefa czasowa, w której obecnie mają ustawiony komputer, może być strefą czasową, której chcieliby używać w aplikacji. Na przykład w przypadku internetowego oprogramowania do kalendarzy (takiego jak Kalendarz Google lub Outlook.com) użytkownik może ustawić strefę czasową w swoim profilu użytkownika.

+0

Kiedy próbuję dostać się do Firefoksa, nie pokazuje kodu IANA, ale "Etc/+ 9GMT". Czy można zamiast tego uzyskać IAN? –

+0

Czy jesteś pewien, że to dokładnie to, co zostało zwrócone? Jeśli byłeś w strefie czasowej UTC-9 bez DST, odpowiedź "Etc/GMT + 9" byłaby prawidłową strefą czasową IANA. Ale to, co napisałeś, ma znaki poza kolejnością. –

+0

Przepraszam, mój błąd. Zawsze zwraca 'Etc/GMT-9', a nie kod IANA' Asia/Seoul' zgodnie z oczekiwaniami.W 64-bitowych wersjach Chrome Mac 61.0.3163.100 i Safari działają idealnie. Tylko Firefox wraca w ten sposób. (using moment.tz.guess() lub jstz.determine() .. oba tak powracają) –