PHP wykrywanie czasu letniego

Muszę wysłać e-mail do użytkowników z dowolnego miejsca na świecie o 9: 00 czasu lokalnego. Serwer znajduje się w Wielkiej Brytanii. To, co mogę zrobić, to ustawić różnicę czasu między każdym użytkownikiem a czasem serwera, która wtedy idealnie by działała, gdyby DST nie istniał.

Oto przykład do zilustrowania:

  • John pracuje w Nowym Jorku, -5 godzin od serwera (UK) czas
  • Richard pracuje w Londynie, Wielka Brytania, więc 0 godzin różnicy z serwerem.

Gdy serwer idzie z GMT do GMT + 1 (BST)o 2: 00 w pewną niedzielę, oznacza to, że John ma teraz różnicę czasu-6H.

Ten scenariusz nadal mogę obsługiwać aktualizując wszystkich użytkowników poza czasem lokalnym serwera, ale gdy już przesunąłem do przodu / do tyłu Czas wszystkich innych użytkowników, nadal potrzebuję sposobu, aby wykryć kiedy (czas i data) użytkownicy mieszkający poza Wielką Brytanią (lub nie) zmienią swój czas lokalny na prawdopodobny czas DST.

Potrzebuję metody PHP, aby wiedzieć/wykryć, kiedy inne części świata wejdą/wyjdą DST.

Author: halfer, 2011-05-27

3 answers

Czy musisz znać wszystkie szczegóły przejścia DST samodzielnie? a może po prostu musisz wiedzieć, kiedy jest 9: 00 w danej strefie czasowej?

Jeśli jest to drugie, PHP może użyć bazy danych strefy czasowej Twojego systemu operacyjnego, aby zrobić to za Ciebie. Funkcja strtotime () jest niezwykle dobra w "zrozumieniu" 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"

Upewnij się, że używasz jednej z stref czasowych obsługiwanych przez PHP.

 24
Author: squirrel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-27 18:40:22

Jak wskazuje Jimmy, możesz używać przejść stref czasowych, ale nie jest to dostępne w PHP =5.2.2, ale getTransitions () z argumentami nie jest! W takim przypadku tutaj jest funkcja, która może dać dane strefy czasowej, w tym czy w DST lub 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;
}

Powiedziawszy to, istnieje prostsza metoda wykorzystująca metodę date (), jeśli chcesz tylko wiedzieć, czy Strefa czasowa jest w DST. Na przykład, jeśli chcesz wiedzieć, czy UK jest w DST, możesz to zrobić:

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

... lub podaj znacznik czasu jako drugie arg do date (), jeśli chcesz określić datetime inny niż bieżący czas serwera.

 19
Author: Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-14 12:24:32

Zmieniam nieco moją odpowiedź: DateTimeZone::getTransitions wygląda na to, że zrobi to, czego potrzebujesz, pod warunkiem, że masz PHP >= 5.2.

Z komentarza 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 tutaj, wszystko co musimy zrobić, to przejść w strefie czasowej, którą chcemy sprawdzić i możemy wiedzieć, czy ta strefa czasowa jest w DST / co to jest offset. Następnie musisz sprawdzić przesunięcie względem GMT, aby sprawdzić, czy chcesz wysłać swój e-mail teraz, czy nie teraz.

 12
Author: Jimmy Sawczuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-07 11:45:02