PHP economisind timp de detectare a luminii naturale

voturi
25

Am nevoie pentru a trimite un e-mail utilizatorilor pe oriunde în lume, la 9:00, ora locală. Serverul este în Marea Britanie. Ceea ce pot face este configurat o diferență de timp între fiecare utilizator și timpul serverului, care ar lucra apoi perfect dacă ora de vară nu există.

Iată un exemplu pentru a ilustra:

  • John lucrează în New York, -5 oră de la server (Marea Britanie) timp
  • Richard lucrează în Londra, Marea Britanie, astfel încât 0 diferență oră cu serverul.

Când serverul merge de la GMT la GMT +1 (BST), la 2:00 pe o anumită duminică, acest lucru înseamnă că Ioan are acum o diferență de timp -6H acum.

Acest scenariu pot ocupa în continuare prin actualizarea tuturor utilizatorilor din afara ora locală a serverului, dar odată ce m - am mutat înainte / înapoi timpul tuturor celorlalți utilizatori, am nevoie de încă o modalitate de a detecta atunci când (ora și data) utilizatorii care trăiesc în afara Regatului Unit va (sau nu) schimba ora locală la una DST probabilă.

Am nevoie de o metodă PHP pentru a ști / detecta când alte părți ale lumii va intra / ieșire DST.

Întrebat 27/05/2011 la 17:35
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
12

Schimbarea răspunsul meu un pic: DateTimeZone :: getTransitions se pare ca va face ceea ce ai nevoie, cu condiția să aveți PHP> = 5.2.

Dintr-un comentariu în documentație:

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

Deci, aici, tot ce trebuie să facem este să treacă în zona de fus orar dorim să verifice și să putem ști dacă fus orar este în DST / ceea ce este diferența. Apoi, va trebui să verificați diferența față de GMT pentru a vedea dacă doriți să trimiteți e-mail acum, sau nu acum.

Publicat 27/05/2011 la 17:40
sursa de către utilizator

voturi
23

Ai nevoie sa stii toate detaliile de tranziție DST tine? sau pur și simplu nu trebuie să știți când este 9:00 într-un anumit fus orar?

Dacă este acesta din urmă, PHP poate utiliza baza de date fusul orar al sistemului de operare pentru a face asta pentru tine. Strtotime () funcția este remarcabil de bun la „imaginind“ ce vrei să spui:

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

Doar asigurați - vă că utilizați unul dintre PHP sprijinit fusul orar .

Publicat 27/05/2011 la 19:40
sursa de către utilizator

voturi
19

După cum arată Jimmy puteți utiliza tranziții de fus orar, dar acest lucru nu este disponibil pe PHP <5.3. ca DateTimeZone () este PHP> = 5.2.2, dar getTransitions () cu argumente nu este! În acest caz, aici este o funcție care vă poate oferi date de fus orar, inclusiv dacă în DST sau nu.

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

Acestea fiind spuse, există o metodă mai simplă, folosind data () în cazul în care aveți nevoie doar să știu dacă un fus orar este în DST. De exemplu, dacă doriți să știți dacă Marea Britanie este în DST puteți face acest lucru:

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

... sau de a furniza o amprentă de timp ca un al doilea arg până în prezent (), dacă doriți să specificați un alt server decât timpul curent datetime.

Publicat 14/06/2012 la 13:02
sursa de către utilizator

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