PHP zapisywania wykrywanie czasu letniego

głosy
25

Muszę wysłać e-mail do użytkowników na podstawie gdziekolwiek na świecie, o godzinie 9:00 czasu lokalnego. Serwer jest w Wielkiej Brytanii. Co mogę zrobić, to ustawić różnicę czasu pomiędzy każdym użytkownikiem i czas serwera, który będzie wtedy doskonale działać, jeśli strefa czasowa nie istnieje.

Oto przykład na to zilustrować:

  • John pracuje w Nowym Jorku, od -5 godzin (UK) czasu serwera
  • Richard pracuje w Londynie, w Wielkiej Brytanii, więc różnica 0 godzin z serwerem.

Gdy serwer idzie od GMT GMT +1 (BST) o godzinie 2:00 w pewnej niedzieli, oznacza to, że John ma teraz -6H różnicę czasu.

Ten scenariusz może nadal obsługiwać poprzez aktualizację wszystkich użytkowników spoza czasu lokalnego serwera, ale kiedy już ruszył do przodu / do tyłu czas wszystkich innych użytkowników, wciąż potrzebujemy sposobu wykrywania gdy jest (czas i data) użytkowników mieszkających poza granicami Wielkiej Brytanii będzie (lub nie) zmieniają swój czasu lokalnego do prawdopodobnej jednej DST.

Muszę wiedzieć metodę PHP / wykryć, gdy inne części świata wejdzie / wyjścia DST.

Utwórz 27/05/2011 o 17:35
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
12

Zmiana moja odpowiedź trochę: DateTimeZone :: getTransitions wygląda to zrobi, co trzeba, o ile masz PHP> = 5,2.

Z komentarzem w dokumentacji:

<?php 
$theTime = time(); // specific date/time we're checking, in epoch seconds. 

$tz = new DateTimeZone('America/Los_Angeles'); 
$transition = $tz->getTransitions($theTime, $theTime); 

// only one array should be returned into $transition. Now get the data: 
$offset = $transition[0]['offset']; 
$abbr = $transition[0]['abbr']; 
?>

Więc, wszystko co musisz zrobić, to przejść do strefy czasowej, którą chcemy sprawdzić i możemy wiedzieć, że jeśli strefa czasowa jest w DST / co offset jest. Będziesz wtedy trzeba sprawdzić offset przeciwko GMT aby zobaczyć, czy chcesz wysłać wiadomość e-mail teraz, czy nie teraz.

Odpowiedział 27/05/2011 o 17:40
źródło użytkownik

głosy
23

Czy trzeba znać wszystkie szczegóły DST przejścia siebie? czy po prostu trzeba wiedzieć, kiedy jest 09:00 w danej strefie czasowej?

Jeśli to ostatnie, PHP można użyć bazy danych strefy czasowej w systemie operacyjnym, aby zrobić to za Ciebie. Strtotime () funkcja jest wyjątkowo dobry w „zastanawianie się” co masz na myśli:

echo strtotime("today 9:00 am America/New_York");  // prints "1306501200"
echo strtotime("today 9:00 am Europe/London");     // prints "1306483200"

Tylko upewnij się, że używasz jednego z PHP obsługiwane stref czasowych .

Odpowiedział 27/05/2011 o 19:40
źródło użytkownik

głosy
19

Jimmy wskazuje, można użyć przejścia strefy czasowej, ale to nie jest dostępne w PHP <5.3. jak dateTimeZone () jest PHP> = 5.2.2 ale getTransitions () z argumentów nie jest! W tym przypadku o to funkcja, która może dać Ci dane strefy czasowej, w tym, czy w DST, czy nie.

function timezonez($timezone = 'Europe/London'){
    $tz = new DateTimeZone($timezone);
    $transitions = $tz->getTransitions();
    if (is_array($transitions)){
        foreach ($transitions as $k => $t){
            // look for current year
            if (substr($t['time'],0,4) == date('Y')){
                $trans = $t;
                break;
            }
        }
    }
    return (isset($trans)) ? $trans : false;
}

Mimo, że istnieje prostszy sposób korzystania Date (), jeśli po prostu chcesz wiedzieć, czy strefa czasowa jest w DST. Na przykład, jeśli chcesz wiedzieć, czy Wielka Brytania jest w DST można to zrobić:

date_default_timezone_set('Europe/London');
$bool = date('I'); // this will be 1 in DST or else 0

... lub dostarczyć znacznik czasu jako drugi arg (do tej pory), jeśli chcesz określić datetime inny niż aktualny czas serwera.

Odpowiedział 14/06/2012 o 13:02
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more