Drapacz głowicy dla Ciebie.Konwersja przesunięcia UTC do strefy czasowej lub daty
jestem chwytając geo danych IP z interfejsu API IPInfoDB „s i zwraca strefy czasowej UTC z tym DST (jeśli aktualnie widoczne).
Na przykład, mieszkam w EST (-5), a obecnie jest to czas letni, więc funkcja API geo IP zwraca (-04:00
) jako przesunięcie.
To jest wspaniałe, ponieważ DST to bolesny ból głowy. Ale ku mojemu zaskoczeniu spowodowało to kolejny ból głowy.
Załaduję te dane w PHP, które mają być przekazywane za pośrednictwem AJAX do aplikacji. Chciałbym mieć lokalny czas na żywo z adresu IP w aplikacji.
Mam wszystko ustawione idealnie, ale zwariowałem próbując dowiedzieć się, jak ustawić strefę czasową PHP, aby dopasować offset, więc mogę po prostu chwycić bieżące godziny date('H');
i minuty date('i');
przejść przez AJAX.
Nie jestem pewien, czy istnieje konkretna funkcja, która może podać mi aktualne godziny i minuty w oparciu o to przesunięcie, lub czy istnieje praktyczny sposób ustawienia strefy czasowej w oparciu o przesunięcie (które będzie miało już zastosowanie DST, jeśli jest w efekcie).
Szukałem i przeszukując Google, aby znaleźć odpowiedź na to pytanie, ale to, co robię, jest bardziej szczegółowe, ponieważ DST jest już stosowane.
Znalazłem jedną funkcję na PHP.net, która wydaje się działać (działa dla mojej strefy czasowej i zwraca prawidłowy czas), chociaż dla innych stref czasowych, takich jak PST, powraca 1 godzinę później niż powinno być, nawet jeśli przesunięcie jest poprawne (-07:00
z DST).
Strefa czasowa zwrócona przez funkcję to Chile/EasterIsland
, której przyczyną jest odczucie. Gdybym mógł, zrobiłbym to tylko dla Stanów Zjednoczonych, ale potrzebuję, żeby był na całym świecie.
To jest funkcja, którą mam teraz. Proszę wybaczyć wyjątkowo niechlujny kod. W ciągu ostatnich kilku godzin bawiłem się z mnóstwem rzeczy próbując znaleźć rozwiązanie.
Większość funkcji została znaleziona online.
function offsetToTZ($offset) {
switch((string) $offset) {
case '-04:30' : return 'America/Caracas'; break;
case '-03:30' : return 'Canada/Newfoundland'; break;
case '+03:30' : return 'Asia/Tehran'; break;
case '+04:30' : return 'Asia/Kabul'; break;
case '+05:30' : return 'Asia/Kolkata'; break;
case '+05:45' : return 'Asia/Kathmandu'; break;
case '+09:30' : return 'Australia/Darwin'; break;
}
$offset = (int) str_replace(array('0',0,':00',00,'30',30,'45',45,':','+'),'', (string) $offset);
$offset = $offset*60*60;
$abbrarray = timezone_abbreviations_list();
foreach ($abbrarray as $abbr) {
foreach($abbr as $city) {
if($city['offset'] == $offset) {
return $city['timezone_id'];
}
}
}
return false;
}
włączyłem przełącznik/Pokrowce na pewnych stref czasowych, które są :30
i :45
tam. Może istnieć sposób uwzględnienia tego również bez potrzeby przełącznika/obudowy.
UWAGA: Przesunięcia są zawsze zwracane jako taki +00:00
lub -00:00
z geo IP API.
Byłbym wdzięczny za każdą pomoc lub punkt we właściwym kierunku. Nie jestem zbyt początkującym z PHP, ale offsety to dla mnie nowa historia. Dzięki!
To jest coś, czego szukałem. Wygląda na to, że będzie działać dobrze, ale muszę poświęcić trochę czasu i przetestować go. Tak czy inaczej, jesteś osobą z najbliższym rozwiązaniem, którego szukałem. Doceniam twoją pomoc i dobrze zasłużyłeś na nagrodę :) –
Uważaj, jest błąd: https://bugs.php.net/bug.php?id=44780 –
@HonzaJavorek Interesujące, myślę, że to dlatego, że pewne miejsca nie dostosowują się do zmiany czasu na letni. Myślę, że znalazłem rozwiązanie tego problemu. –