Konwertuj przesunięcie UTC na strefę czasową lub datę

Głowy drapacz dla ciebie.

Pobieranie danych geo IPIPInfoDBAPI i zwraca przesunięcie strefy czasowej z UTCwłącznie z DST (jeśli jest obecnie odzwierciedlone).

Na przykład mieszkam w EST (-5), a obecnie jest to DST, więc geo IP API powraca (-04:00) jako przesunięcie.

To cudowne, ponieważ DST to straszny ból głowy. Ale ku mojemu zaskoczeniu spowodowało to kolejny ból głowy.

Ładuję te dane w PHP, aby przekazać je przez aplikację AJAX. Chciałbym mieć na żywo lokalny czas adresu IP w aplikacji.

Mam to wszystko idealnie ustawione, ale wariuję, próbując dowiedzieć się, jak ustawić strefę czasową PHP tak, aby odpowiadała przesunięciu, dzięki czemu mogę po prostu pobrać bieżące godzinydate('H'); i minutydate('i'); przekazać za pośrednictwem AJAX.

Nie jestem pewien, czy istnieje konkretna funkcja, która może po prostu dać mi aktualne godziny i minuty na podstawie tego przesunięcia lub czy istnieje praktyczny sposób ustawienia strefy czasowej na podstawie przesunięcia (które będzie miało już zastosowany czas letni, jeśli jest w użyciu) .

Szukałem i przeszukiwałem Google, aby znaleźć odpowiedź na to pytanie, ale to, co robię, jest bardziej szczegółowe, ponieważ DST jest już stosowany.

Znalazłem jedną funkcjęPHP.net wydaje się, że to robi sztuczkę (działa na moją strefę czasową i zwraca prawidłowy czas), chociaż dla innych stref czasowych, takich jak PST, powraca 1 godzinę później niż powinno, nawet jeśli przesunięcie jest prawidłowe (-07:00 z DST).

Strefa czasowa zwrócona z funkcji toChile/EasterIsland co mam przeczucie jest przyczyną. Gdybym mógł, zrobiłbym to tylko dla USA, ale potrzebuję go na całym świecie.

To jest funkcja, którą mam teraz. Proszę wybaczyć bardzo niechlujny kod. W ciągu ostatnich kilku godzin bawiłem się 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; 
}

Załączam przełącznik / obudowę dla niektórych stref czasowych:30 i:45 tam. Może istnieć sposób na włączenie tego również bez potrzeby przełączania / obudowy.

UWAGA: Przesunięcia są zawsze zwracane jako takie+00:00 lub-00:00 z geo IP API.

Byłbym wdzięczny za każdą pomoc lub wskazówkę we właściwym kierunku. Nie jestem zbytnio początkujący w PHP, ale offsety to dla mnie nowa historia. Dzięki!

questionAnswers(8)

yourAnswerToTheQuestion