Jak mogę zebrać informacje o strefie czasowej użytkownika? Potrzebuję strefy czasowej, a także godzin przesunięcia GMT.
javascript
timezone
Árvíztűrő tükörfúrógép
źródło
źródło
Odpowiedzi:
Pamiętaj, że nie wszystkie strefy czasowe są przesunięte o całe godziny: na przykład Nowa Fundlandia ma UTC minus 3h 30m (pozostawiając czas letni poza równaniem).
źródło
getTimezoneOffset
niedokładności? Artykuł, do którego się odwołujesz, pochodzi z czerwca 2007 r. I nie zawiera szczegółowych informacji na temat niedokładności funkcji. W rzeczywistościjsTimezoneDetect
wskazana bibliotekagetTimezoneOffset
sama się używa .var hrs = -(new Date().getTimezoneOffset() / 60)
aby uzyskać przesunięcie w godzinach zwykle używanychtimezone
! =utc offset
Użycie przesunięcia do obliczenia strefy czasowej jest niewłaściwym podejściem i zawsze będziesz mieć problemy. Strefy czasowe i reguły dotyczące czasu letniego mogą zmieniać się kilkakrotnie w ciągu roku i trudno jest nadążyć za nimi.
Aby uzyskać strefę czasową IANA systemu w JavaScript, powinieneś użyć
Od września 2019 r. Działa to w 95% przeglądarek używanych na całym świecie .
Stare informacje o zgodności
ecma-402 / 1.0 mówi, że
timeZone
może być niezdefiniowany, jeśli nie zostanie przekazany konstruktorowi. Jednak przyszły projekt (3.0) rozwiązał ten problem, zmieniając domyślną strefę czasową systemu.w ecma-402 / 3.0, który jest wciąż w wersji roboczej, zmieniono na
źródło
Zdaję sobie sprawę, że ta odpowiedź jest nieco nie na temat, ale wyobrażam sobie, że wielu z nas szukających odpowiedzi również chciało sformatować strefę czasową do wyświetlania i być może również uzyskać skrót strefy. No i proszę…
Jeśli chcesz, aby strefa czasowa klienta była ładnie sformatowana, możesz polegać na metodzie Date.toString JavaScript i wykonać:
To da ci na przykład „GMT-0400 (EST)”, w tym minuty strefy czasowej, jeśli dotyczy.
Alternatywnie za pomocą wyrażenia regularnego możesz wyodrębnić dowolną część:
W przypadku „GMT-0400 (EDT)”:
W przypadku „GMT-0400”:
Tylko „EDT”:
Tylko „-0400”:
Odwołanie do Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
źródło
split[4] + " " + split[5]
?!split
zawiera:["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
więc wynik toDaylight Time)
new Date().toString()
jest całkowicie zależna od ustawień regionalnych. Oczekiwanie, że wyniki innych klientów będą podobne do twoich, jest bardzo złym pomysłem.Odpowiedzieliśmy już, jak uzyskać przesunięcie w minutach jako liczbę całkowitą, ale na wypadek, gdyby ktoś chciał lokalnego przesunięcia GMT jako ciągu, np .
"+1130"
:źródło
pad(parseInt(Math.abs(offset/60)), 2)
aby zrobić to dobrze ... w przeciwnym razie możesz dostać +5.530, jak w moim przypadku ... nie jestem pewien, czy podłoga matematyczna itp. Będzie lepsza, czy nie ... ale to co najmniej daje mi +0530 zgodnie z oczekiwaniamiMożesz użyć:
strefa czasowa
Wykrywanie strefy czasowej w przeglądarce jest dość trudne, aby uzyskać właściwy wynik, ponieważ przeglądarka zapewnia niewiele informacji.
Moment Strefa czasowa wykorzystuje
Date.getTimezoneOffset()
iDate.toString()
przez kilka chwil w ciągu bieżącego roku, aby zebrać jak najwięcej informacji o środowisku przeglądarki. Następnie porównuje te informacje ze wszystkimi załadowanymi danymi strefy czasowej i zwraca najbliższe dopasowanie. W przypadku powiązań zwracana jest strefa czasowa z miastem o największej liczbie mieszkańców.źródło
W swoim projekcie napisałem funkcję, która zwraca strefę czasową w
hh:mm
formacie. Mam nadzieję, że może to komuś pomóc:Pokaż fragment kodu
Working Fiddle
źródło
Jednowierszowy, który podaje zarówno przesunięcie, jak i strefę czasową, to po prostu wywołanie metody toTimeString () na nowym obiekcie Date. Z MDN:
Problem polega na tym, że strefa czasowa nie ma standardowego formatu IANA; jest nieco bardziej przyjazny dla użytkownika niż format IANA „kontynent / miasto” . Wypróbuj to:
Obecnie w Kalifornii
toTimeString()
zwraca,Pacific Daylight Time
gdy wraca interfejs API IntlAmerica/Los_Angeles
. W Kolumbii dostanieszColombia Standard Time
kontraAmerica/Bogota
.Zauważ, że wiele innych odpowiedzi na to pytanie próbuje uzyskać te same informacje, wywołując Date.toString (). To podejście nie jest tak niezawodne, jak wyjaśnia MDN :
źródło
spróbuj
getTimezoneOffset()
tegoDate
obiektu:Ta metoda zwraca przesunięcie strefy czasowej w minutach, co stanowi różnicę między czasem GMT a czasem lokalnym w minutach.
źródło
JavaScript:
źródło
Z moment.js :
źródło
z
izz
zostały wycofane z wersji 1.6.0 patrz momentjs.com/docs/#/displaying/formatZ
iZZ
.zoneAbbr()
zostały zastąpionez
izz
. Zobacz dokumentację tutajZ momentjs, możesz znaleźć aktualną strefę czasową jako
Z dayjs, możesz znaleźć aktualną strefę czasową jako
Oba API zwracają przesunięcie utc w ciągu kilku minut.
źródło
getTimezoneOffset()
.Strefa czasowa w godzinach
Jeśli chcesz być precyzyjny, jak wspomniałeś w komentarzu, powinieneś spróbować w ten sposób:
źródło
Jeśli wszystko, czego potrzebujesz, to skrót strefy czasowej „MST” lub „EST”:
źródło
Date.toString()
nie jest niezawodne, a MDN wyjaśnia, dlaczego. Mam wklejony odpowiednią sekcję z ich docs w mojej odpowiedzi .Zobacz, jak ten wynikowy operator był odwrotny do strefy czasowej. Więc zastosuj jakąś funkcję matematyczną, a następnie sprawdź liczbę mniejszą lub większą.
Zobacz dokument MDN
źródło
round
? Powinno byćfloor
, prawda?Przykład: czw. 21 czerwca 2018 18:12:50 GMT + 0530 (czas standardowy w Indiach)
O / P: +0530
źródło
Date.toString()
nie jest niezawodne, a MDN wyjaśnia, dlaczego. Mam wklejony odpowiednią sekcję z ich docs w mojej odpowiedzi .Spróbuj tego,
źródło
Ta wartość pochodzi z komputera użytkownika i można ją zmienić w dowolnym momencie, więc myślę, że to nie ma znaczenia, chcę tylko uzyskać przybliżoną wartość, a następnie przekonwertować ją na GMT na moim serwerze.
Na przykład jestem z Tajwanu i zwraca mi „+8”.
Przykład roboczy
JS
HTML
Wynik
źródło
Na
new Date(
) możesz uzyskać przesunięcie, aby uzyskać nazwę strefy czasowej, którą możesz zrobić:new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
otrzymasz wartość pomiędzy
()
końcem daty, czyli nazwą strefy czasowej.źródło
Date.toString()
nie jest niezawodne, a MDN wyjaśnia, dlaczego. Mam wklejony odpowiednią sekcję z ich docs w mojej odpowiedzi . Odpowiedź ta została już udzielona co najmniej 3 razy.To byłoby moje rozwiązanie: