PHP zomertijd detectie

stemmen
25

Ik moet een e-mail te sturen naar gebruikers op basis waar ook ter wereld om 9.00 uur lokale tijd. De server is in het Verenigd Koninkrijk. Wat ik wel kan doen is het opzetten van een tijdsverschil tussen elke gebruiker en de tijd van de server, die dan perfect zou werken als DST niet bestond.

Hier is een voorbeeld om dit te illustreren:

  • John werkt in New York, -5 uur vanaf de server (UK) tijd
  • Richard werkt in Londen, UK, dus 0 uur verschil met de server.

Wanneer de server gaat van GMT GMT +1 (BST) om 2:00 uur op een bepaalde zondag, betekent dit dat John heeft nu een 6H tijdverschil nu.

Dit scenario Ik kan nog steeds behandelen door bijwerking van alle gebruikers buiten lokale tijd van de server, maar zodra ik naar voren hebt verplaatst / achteruit de tijd van alle andere gebruikers, ik een manier om te detecteren moeten nog wanneer (datum en tijd) de gebruikers wonen buiten het Verenigd Koninkrijk zal (of niet) veranderen hun lokale tijd om een waarschijnlijke DST één.

Ik heb een PHP methode om te weten / detecteren wanneer andere delen van de wereld / exit DST zal treden.

De vraag is gesteld op 27/05/2011 om 17:35
bron van user
In andere talen...                            


3 antwoorden

stemmen
12

Het veranderen van mijn antwoord een beetje: DateTimeZone :: getTransitions eruit ziet alsof hij zal doen wat je nodig hebt, mits je PHP> = 5,2.

Vanuit een opmerking in de documentatie:

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

Dus hier, alles wat we moeten doen, is pas in de tijdzone we willen controleren en we kunnen weten of dat tijdzone is in DST / wat de offset. U zult dan moeten controleren verrekenen GMT om te zien of u wilt uw e-mail nu verzenden of niet nu.

antwoordde op 27/05/2011 om 17:40
bron van user

stemmen
23

Wilt u alle details van DST weten overgang jezelf? of wil je gewoon weten wanneer is 9:00 uur in een bepaalde tijdzone?

Als het laatste het geval is, kan PHP van uw besturingssysteem tijdzone database te gebruiken om dat te doen voor je. De strtotime () functie is opvallend goed in het "uitzoeken" wat je bedoelt:

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

Zorg ervoor dat u een van de PHP ondersteunde tijdzones .

antwoordde op 27/05/2011 om 19:40
bron van user

stemmen
19

Zoals Jimmy wijst erop kun je tijdzone overgangen gebruiken, maar dit is niet beschikbaar op PHP <5.3. als dateTimeZone () is PHP> = 5.2.2 maar getTransitions () met argumenten is het niet! In dat geval is hier een functie die u tijdzone gegevens kan geven, onder meer ook bij DST of niet.

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

Dat gezegd hebbende, er is een eenvoudiger methode met datum () als je gewoon nodig hebt om te weten of een andere tijdzone is in DST. Bijvoorbeeld als u wilt weten of het Verenigd Koninkrijk is in DST u dit kunt doen:

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

... of leveren een tijdstempel als tweede arg-to-date () als je wilt naar een andere dan uw huidige server tijd datetime opgeven.

antwoordde op 14/06/2012 om 13:02
bron van user

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