PHP sommertid deteksjon

stemmer
26

Jeg trenger å sende en e-post til brukere basert uansett hvor i verden til 09:00 lokal tid. Serveren er i Storbritannia. Det jeg kan gjøre er å sette opp en tidsforskjell mellom hver bruker og serverens tid, som da ville perfekt fungere hvis DST ikke eksisterte.

Her er et eksempel for å illustrere det:

  • John arbeider i New York, -5 timer fra serveren (UK) tid
  • Richard arbeider i London, UK, så 0 time forskjell med serveren.

Når serveren går fra GMT til GMT +1 (BST) på 02:00 på en bestemt søndag, betyr dette at John har nå en 6H tidsforskjell nå.

Dette scenariet jeg kan fortsatt håndtere ved å oppdatere alle brukere utenfor serverens lokal tid, men når jeg har flyttet forover / bakover tidspunktet for alle andre brukere, jeg fortsatt trenger en måte å oppdage når (klokkeslett og dato) for brukerne å leve utenfor Storbritannia vil (eller ikke vil) endre sin lokale tid til en sannsynlig DST en.

Jeg trenger en PHP metode for å vite / oppdage når andre deler av verden vil gå inn / utgang DST.

Publisert på 27/05/2011 klokken 16:35
kilden bruker
På andre språk...                            


3 svar

stemmer
12

Endre mitt svar litt: DateTimeZone :: getTransitions ser ut som det vil gjøre det du trenger, forutsatt at du har PHP> = 5,2.

Fra en kommentar i dokumentasjonen:

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

Så her, alt vi trenger å gjøre er å passere i tidssonen vi ønsker å sjekke, og vi kan vite om at tidssonen er i DST / hva forskyvningen er. Du må deretter sjekke utlignet mot GMT å se om du vil sende e-post nå, eller ikke nå.

Svarte 27/05/2011 kl. 16:40
kilden bruker

stemmer
24

Trenger du å vite alle detaljene DST overgang selv? eller har du bare trenger å vite når er 09:00 i et gitt tidssonen?

Hvis det er sistnevnte, kan PHP bruke operativsystemets tidssone database for å gjøre det for deg. Den strtotime () funksjon er utrolig flinke til å "finne ut" hva du mener:

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

Bare sørg for at du bruker en av PHP støttet tidssoner .

Svarte 27/05/2011 kl. 18:40
kilden bruker

stemmer
19

Som Jimmy påpeker du kan bruke tidssone overganger, men dette er ikke tilgjengelig på PHP <5,3. som dateTimeZone () er PHP> = 5.2.2 men getTransitions () med argumenter er det ikke! I så fall her er en funksjon som kan gi deg tidssone data, herunder om i DST eller ikke.

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

Når det er sagt, det er en enklere metode med dato () hvis du bare trenger å vite om en tidssone er i DST. For eksempel hvis du ønsker å vite om Storbritannia er i DST kan du gjøre dette:

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

... eller levere et tidsstempel som andre arg oppdatert () hvis du ønsker å spesifisere en annen enn din nåværende server tid datetime.

Svarte 14/06/2012 kl. 12:02
kilden bruker

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