PHP letního času detekce

hlasů
25

Musím poslat e-mail pro uživatele založených kdekoliv na světě v 9:00 místního času. Server je ve Velké Británii. Co mohu udělat, je nastavit časový rozdíl mezi každým uživatelem a čas serveru, který by pak dokonale fungovat, pokud neexistoval DST.

Zde je příklad to ilustruje:

  • John pracuje v New Yorku, -5 hodin od (UK) času na serveru
  • Richard pracuje v Londýně, takže 0hodina rozdíl se serverem.

Když server přejde od GMT GMT +1 (CEST) ve 2:00 na určitou neděli, to znamená, že John má nyní časový rozdíl -6H teď.

Tento scénář ještě mohu zvládnout aktualizací všem uživatelům mimo místního času serveru, ale jakmile jsem se pohyboval vpřed / vzad čas ze všech ostatních uživatelů, pořád potřebují způsob, jak rozpoznat , kdy (datum a čas) uživatele žijící mimo Velkou Británii bude (či nebude) změní svůj místní čas k pravděpodobnému DST jeden.

Musím metodu PHP zjistit / rozpoznat, kdy v jiných částech světa vstoupí / exit DST.

Položena 27/05/2011 v 17:35
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
12

Změna má odpověď trochu: DateTimeZone :: getTransitions vypadá, že bude dělat to, co budete potřebovat, pokud máte PHP> = 5,2.

Od komentář v dokumentaci:

<?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']; 
?>

Tak tady všechno, co potřebujeme udělat, je projít v časovém pásmu chceme kontrolovat a my můžeme vědět, jestli, že časové pásmo je v DST / co offset je. Poté budete muset zkontrolovat posun oproti GMT aby zjistil, zda chcete poslat e-mailu nyní, nebo ne teď.

Odpovězeno 27/05/2011 v 17:40
zdroj uživatelem

hlasů
23

Potřebujete znát všechny podrobnosti o DST přechod sám? nebo si jen potřebujete vědět, kdy je 09:00 v daném časovém pásmu?

Pokud je to druhé, PHP mohou využít databáze časových pásem operačního systému k tomu, že pro vás. Strtotime () funkce je pozoruhodně dobrý „přijít na to,“ co máte na mysli:

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

Jen se ujistěte, že používáte jeden z PHP podporován časových pásem .

Odpovězeno 27/05/2011 v 19:40
zdroj uživatelem

hlasů
19

Jimmy poukazuje na to, můžete použít timezone přechody, ale to není dostupný v PHP <5.3. as dateTimeZone () je PHP> = 5.2.2, ale getTransitions () s argumenty, není! V tomto případě je zde funkce, která vám může dát timezone dat, včetně toho, zda v letního času, nebo ne.

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;
}

Který uvedl, že existuje jednodušší způsob pomocí data (), pokud stačí vědět, zda je časové pásmo je v DST. Například pokud chcete vědět, zda Velká Británie je v DST můžete udělat toto:

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

... nebo vydávat časové razítko jako druhý arg k dnešnímu dni (), chcete-li zvolit jiné než aktuální čas serveru datetime.

Odpovězeno 14/06/2012 v 13:02
zdroj uživatelem

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