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.
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.
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.
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.
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