Czy istnieje standardowy sposób, aby serwer WWW mógł określić strefę czasową użytkownika na stronie internetowej?
Być może z nagłówka HTTP lub części user-agent
ciągu?
html
browser
timezone
user-agent
timezone-offset
Kevin Dente
źródło
źródło
Odpowiedzi:
Metoda
getTimezoneOffset()
odejmie Twój czas od GMT i zwróci liczbę minut. Więc jeśli mieszkasz w GMT-8, zwróci 480.Aby przeliczyć to na godziny, podziel przez 60. Zwróć też uwagę, że znak jest przeciwieństwem tego, czego potrzebujesz - oblicza przesunięcie GMT od Twojej strefy czasowej, a nie przesunięcie strefy czasowej od GMT. Aby to naprawić, wystarczy pomnożyć przez -1.
Zauważ też, że w3school mówi:
źródło
>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
Najbardziej popularnym (== standardowym) sposobem określania strefy czasowej, którą widziałem, jest po prostu zapytanie użytkowników. Jeśli witryna wymaga subskrypcji, można ją zapisać w danych profilu użytkownika. W przypadku użytkowników anon daty mogą być wyświetlane jako UTC lub GMT lub niektóre podobne.
Nie staram się być mądrym idiotą. Po prostu czasami niektóre problemy mają lepsze rozwiązania poza jakimkolwiek kontekstem programowania.
źródło
Do tej pory nie ma nagłówków HTTP, które zgłosiłyby strefę czasową klientów, chociaż sugerowano włączenie jej do specyfikacji HTTP.
Gdybym to był ja, prawdopodobnie spróbowałbym pobrać strefę czasową za pomocą JavaScript po stronie klienta, a następnie przesłać ją na serwer za pomocą Ajax lub coś takiego.
źródło
JavaScript to najprostszy sposób na uzyskanie czasu lokalnego klienta. Sugerowałbym użycie XMLHttpRequest do odesłania czasu lokalnego, a jeśli to się nie powiedzie, wróć do strefy czasowej wykrytej na podstawie ich adresu IP.
Jeśli chodzi o geolokalizację, użyłem MaxMind GeoIP w kilku projektach i działa dobrze, chociaż nie jestem pewien, czy dostarczają one dane o strefie czasowej. Jest to usługa, za którą płacisz i zapewniają comiesięczne aktualizacje Twojej bazy danych. Zapewniają opakowania w kilku językach internetowych.
źródło
Po pierwsze, zrozum, że wykrywanie stref czasowych w JavaScript jest niedoskonałe. Można uzyskać przesunięcie lokalnej strefy czasowej dla określonej daty i godziny przy użyciu
getTimezoneOffset
instancjiDate
obiektu, ale nie jest to dokładnie to samo, co pełna strefa czasowa IANA, taka jakAmerica/Los_Angeles
.Istnieje jednak kilka opcji, które mogą działać:
Wynikiem jest ciąg zawierający ustawienie strefy czasowej IANA komputera, na którym działa kod.
Obsługiwane środowiska są wymienione w tabeli zgodności Intl . Rozwiń
DateTimeFormat
sekcję i spójrz na nazwaną funkcjęresolvedOptions().timeZone defaults to the host environment
.Niektóre biblioteki, takie jak Luxon, używają tego interfejsu API do określania strefy czasowej za pomocą funkcji takich jak
luxon.Settings.defaultZoneName
.Intl
interfejs API, jeśli jest on dostępny, a gdy nie jest dostępny, sprawdzajągetTimezoneOffset
funkcjęDate
obiektu dla kilku różnych punktów w czasie, wykorzystując wyniki do wybrania odpowiedniej strefy czasowej z wewnętrznego zestawu danych.Zarówno jsTimezoneDetect, jak i moment-timezone mają tę funkcję.
W obu przypadkach wynik można traktować jedynie jako przypuszczenie. Zgadywanie może być poprawne w wielu przypadkach, ale nie we wszystkich.
Ponadto biblioteki te muszą być okresowo aktualizowane, aby przeciwdziałać faktowi, że wiele starszych implementacji JavaScript zna tylko bieżącą regułę czasu letniego dla swojej lokalnej strefy czasowej. Więcej informacji na ten temat tutaj.
Ostatecznie lepszym rozwiązaniem jest zapytanie użytkownika o strefę czasową. Podaj ustawienie, które mogą zmienić. Możesz użyć jednej z powyższych opcji, aby wybrać ustawienie domyślne , ale nie uniemożliwiaj odejścia od tego w aplikacji.
Istnieje również zupełnie inne podejście polegające na tym, że w ogóle nie zależy od ustawienia strefy czasowej komputera użytkownika. Zamiast tego, jeśli możesz zebrać współrzędne szerokości i długości geograficznej, możesz przekształcić je w strefę czasową przy użyciu jednej z tych metod . Działa to dobrze na urządzeniach mobilnych.
źródło
Oto niezawodne rozwiązanie JavaScript do określania strefy czasowej przeglądarki.
https://bitbucket.org/pellepim/jstimezonedetect
Załącznik 1: Teraz ten projekt znajduje się na GitHub: https://github.com/pellepim/jstimezonedetect
źródło
Oto bardziej kompletny sposób.
Fragment znajduje się poniżej:
Pobieranie TZ i DST z JS (przez Way Back Machine)
źródło
Africa/Johannesburg
lubEurope/Istanbul
. Zobacz wiki tagu strefy czasowej .Stosując podejście Unkwntech, napisałem funkcję używając jQuery i PHP. To jest przetestowane i działa!
Na stronie PHP, w której chcesz ustawić strefę czasową jako zmienną, umieść ten fragment kodu gdzieś u góry strony:
Spowoduje to odczytanie zmiennej sesji „time”, którą właśnie stworzymy.
Na tej samej stronie, w <head> musisz przede wszystkim dołączyć jQuery:
Również w <head>, poniżej jQuery, wklej to:
Być może zauważyłeś, ale musisz zmienić adres URL na rzeczywistą domenę.
Ostatnia rzecz. Prawdopodobnie zastanawiasz się, co to do cholery jest strefa czasowa.php. Po prostu: (utwórz nowy plik o nazwie timezone.php i wskaż go za pomocą powyższego adresu URL)
Jeśli to działa poprawnie, najpierw załaduje stronę, uruchom JavaScript i załaduje stronę ponownie. Będziesz wtedy mógł odczytać zmienną $ timezone i wykorzystać ją dla własnej przyjemności! Zwraca bieżące przesunięcie strefy czasowej UTC / GMT (GMT -7) lub dowolną strefę czasową, w której się znajdujesz.
źródło
Aby przesłać przesunięcie strefy czasowej jako nagłówek HTTP dla żądań AJAX za pomocą jQuery
Możesz również zrobić coś podobnego, aby uzyskać rzeczywistą nazwę strefy czasowej, korzystając
moment.tz.guess();
ze strony http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/źródło
Nadal nie widziałem tutaj szczegółowej odpowiedzi, która określa strefę czasową. Nie powinieneś potrzebować geokodować według adresu IP ani używać PHP (lol) lub niepoprawnie zgadywać z przesunięcia.
Po pierwsze, strefa czasowa to nie tylko przesunięcie w stosunku do GMT. Jest to obszar ziemi, w którym zasady czasowe są określone przez lokalne standardy. Niektóre kraje mają czas letni i włączają czas letni w różnym czasie. Zazwyczaj ważne jest uzyskanie rzeczywistej strefy, a nie tylko bieżącego przesunięcia.
Jeśli zamierzasz przechowywać tę strefę czasową, na przykład w preferencjach użytkownika, chcesz strefę, a nie tylko przesunięcie. W przypadku konwersji w czasie rzeczywistym nie będzie to miało większego znaczenia.
Teraz, aby uzyskać strefę czasową z javascript, możesz użyć tego:
Jednak łatwiej mi było użyć tej solidnej wtyczki, która zwraca strefę czasową sformatowaną przez Olsena:
https://github.com/scottwater/jquery.detect_timezone
źródło
Z PHP
date
funkcji otrzymasz datę i godzinę serwera, na którym znajduje się strona. Jedynym sposobem na uzyskanie czasu użytkownika jest użycie JavaScript.Ale sugeruję, abyś, jeśli twoja strona wymaga rejestracji, najlepszym sposobem jest zapytanie użytkownika o rejestrację jako pole obowiązkowe. Możesz wymienić różne strefy czasowe na stronie rejestru i zapisać je w bazie danych. Następnie, jeśli użytkownik zaloguje się na stronie, możesz ustawić domyślną strefę czasową dla tej sesji zgodnie z wybraną strefą czasową użytkownika.
Możesz ustawić dowolną konkretną strefę czasową za pomocą funkcji PHP
date_default_timezone_set
. Ustawia określoną strefę czasową dla użytkowników.Zasadniczo strefa czasowa użytkowników przechodzi po stronie klienta, więc musimy do tego użyć JavaScript.
Poniżej znajduje się skrypt do uzyskiwania strefy czasowej użytkowników za pomocą PHP i JavaScript.
Ale z mojego punktu widzenia lepiej zapytać użytkowników, czy rejestracja jest obowiązkowa w twoim projekcie.
źródło
Nie używaj adresu IP do ostatecznego określania lokalizacji (a tym samym strefy czasowej) - to dlatego, że w przypadku NAT, serwerów proxy (coraz bardziej popularne) i VPN, adresy IP niekoniecznie realistycznie odzwierciedlają rzeczywistą lokalizację użytkownika, ale lokalizację, w której znajdują się serwery implementujące te protokoły.
Podobne do tego, w jaki sposób numery kierunkowe w USA nie są już przydatne do lokalizowania użytkownika telefonu, biorąc pod uwagę popularność przenoszenia numerów.
Adres IP i inne techniki pokazane powyżej są przydatne do sugerowania wartości domyślnej, którą użytkownik może dostosować / poprawić.
źródło
JavaScript:
Po prostu podaj swoje czasy w formacie uniksowego znacznika czasu dla tej funkcji; JavaScript zna już strefę czasową użytkownika.
Lubię to:
PHP:
To zawsze pokaże czasy poprawnie w oparciu o strefę czasową, którą dana osoba ustawiła na swoim komputerze. Dzięki Bogu, nie trzeba nikogo o nic prosić i zapisywać go w miejscach.
źródło
Łatwo, wystarczy użyć
getTimezoneOffset
funkcji JavaScript tak:źródło
Wydaje się, że cała magia jest w środku
Fajnie, nie wiedziałem o tym. Czy to działa w przeglądarce Internet Explorer itp.? Stamtąd powinieneś być w stanie używać JavaScript do Ajax, ustawiać pliki cookie, cokolwiek. Prawdopodobnie sam bym poszedł na ciastko.
Musisz jednak pozwolić użytkownikowi to zmienić. Próbowaliśmy użyć geolokalizacji (przez maxmind), aby to zrobić jakiś czas temu, i było to dość często niewłaściwe - na tyle, że nie warto tego robić, więc po prostu pozwalamy użytkownikowi ustawić to w swoim profilu i wyświetlać powiadomienie użytkownikom, którzy jeszcze ich nie ustawił.
źródło
Oto artykuł (z kodem źródłowym), który wyjaśnia, jak określić i wykorzystać zlokalizowany czas w aplikacji ASP.NET (VB.NET, C #):
W samą porę
Krótko mówiąc, opisane podejście opiera się na
getTimezoneOffset
funkcji JavaScript , która zwraca wartość zapisaną w cookie sesyjnym i wykorzystywaną przez kod w celu dostosowania wartości czasu między GMT a czasem lokalnym. Zaletą jest to, że użytkownik nie musi określać strefy czasowej (kod robi to automatycznie). Jest więcej zaangażowanych (dlatego link do artykułu), ale podany kod sprawia, że jest naprawdę łatwy w użyciu. Podejrzewam, że możesz przekonwertować logikę na PHP i inne języki (o ile rozumiesz ASP.NET).źródło
Jeśli używasz OpenID do uwierzytelniania, Simple Registration Extension rozwiąże problem dla uwierzytelnionych użytkowników (musisz przekonwertować z tz na numeryczny).
Inną opcją byłoby wywnioskowanie strefy czasowej na podstawie preferencji kraju agenta użytkownika. Jest to dość prymitywna metoda (nie działa dla en-US), ale stanowi dobre przybliżenie.
źródło
W JavaScript i PHP jest to proste:
Mimo że użytkownik może zepsuć swój wewnętrzny zegar i / lub strefę czasową, najlepszym sposobem, jaki do tej pory znalazłem, aby uzyskać przesunięcie, pozostaje
new Date().getTimezoneOffset();
. Jest nieinwazyjny, nie boli głowy i eliminuje potrzebę polegania na osobach trzecich.Powiedzmy, że mam tabelę
users
zawierającą poledate_created int(13)
do przechowywania znaczników czasu Unix;Zakładając
creates a new account
, że dane są odbierane przez klienta ,post
a ja potrzebuję doinsert/update
niegodate_created column
uniksowego znacznika czasu klienta, a nie serwera.Ponieważ timezoneOffset jest potrzebny w momencie wstawiania / aktualizacji, jest przekazywany jako dodatkowy element $ _POST, gdy klient przesyła formularz, eliminując w ten sposób potrzebę przechowywania go w sesjach i / lub plikach cookie, a także żadnych dodatkowych trafień na serwer.
Powiedz, że serwer otrzymuje
tzo
jako$_POST['tzo']
;Wstaw / aktualizuj
date_created=$user_timestamp
.Podczas pobierania utworzonej daty możesz przekształcić znacznik czasu w następujący sposób:
Teraz ten przykład może pasować
first
do twoich potrzeb, jeśli chodzi o wstawianie znacznika czasu ... Jeśli chodzi o dodatkowy znacznik czasu lub tabelę, możesz rozważyć wstawienie wartości tzo do tabeli użytkowników do wykorzystania w przyszłości lub ustawienie jej jako sesja lub plik cookie.PS ALE co jeśli użytkownik podróżuje i zmienia strefy czasowe. Loguje się na GMT + 4, szybko jedzie do GMT-1 i loguje się ponownie. Ostatnie logowanie będzie w przyszłości.
Myślę, że ... myślimy za dużo.
źródło
Możesz to zrobić na kliencie w strefie czasowej i wysłać wartość na serwer; przykładowe użycie:
źródło
Uzyskanie prawidłowej nazwy strefy czasowej bazy danych TZ w PHP to proces dwuetapowy:
Dzięki JavaScript możesz uzyskać przesunięcie strefy czasowej w kilka minut
getTimezoneOffset
. To przesunięcie będzie dodatnie, jeśli lokalna strefa czasowa jest opóźniona w stosunku do UTC, i ujemne, jeśli nastąpi w przód. Musisz więc dodać przeciwny znak do odsunięcia.Przekaż to przesunięcie do PHP.
W PHP przekonwertuj to przesunięcie na prawidłową nazwę strefy czasowej za pomocą funkcji timezone_name_from_abbr .
Napisałem na nim post na blogu: Jak wykryć strefę czasową użytkownika w PHP . Zawiera także wersję demo.
źródło
Intl.DateTimeFormat().resolvedOptions().timeZone
i wysłanie go do serwera WWW. Ref: stackoverflow.com/questions/9772955/…Prostym sposobem na to jest użycie:
źródło
Jedną z możliwych opcji jest użycie
Date
pola nagłówka, które jest zdefiniowane w RFC 7231 i powinno obejmować strefę czasową. Oczywiście nie ma gwarancji, że wartość jest tak naprawdę strefą czasową klienta, ale może być dogodnym punktem wyjścia.źródło
Oto jak to robię. Spowoduje to ustawienie domyślnej strefy czasowej PHP na lokalną strefę czasową użytkownika. Wystarczy wkleić następujące na górze wszystkich stron:
źródło
Wypróbuj ten kod PHP:
źródło