détection de l'heure d'été PHP

voix
25

Je dois envoyer un e-mail aux utilisateurs en fonction partout dans le monde à 9h00 heure locale. Le serveur est au Royaume-Uni. Ce que je peux faire est de mettre en place une différence de temps entre chaque utilisateur et le temps du serveur, qui serait alors fonctionner parfaitement si l'heure d'été n'existait pas.

Voici un exemple pour l'illustrer:

  • John travaille à New York, -5 heures à partir du serveur (Royaume-Uni) le temps
  • Richard travaille à Londres, Royaume-Uni, donc 0 heure de différence avec le serveur.

Lorsque le serveur passe de GMT à GMT +1 (BST) à 02h00 sur un certain dimanche, cela signifie que John a maintenant une différence de temps -6H maintenant.

Ce scénario , je peux toujours gérer en mettant à jour tous les utilisateurs en dehors de l' heure locale, mais une fois que je me suis déplacé en avant / arrière le temps de tous les autres utilisateurs, il me faut encore un moyen de détecter le serveur quand (heure et date) , les utilisateurs vivant en dehors du Royaume - Uni sera (ou pas) changer l' heure locale à une heure d' été probable.

J'ai besoin d'une méthode PHP pour savoir / détecter d'autres parties du monde entreront / sortie DST.

Créé 27/05/2011 à 17:35
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
12

Changer ma réponse un peu: DateTimeZone :: getTransitions dirait qu'il va faire ce que vous avez besoin, si vous avez PHP> = 5.2.

D'un commentaire dans la documentation:

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

Voici donc, tout ce que nous devons faire est de passer dans le fuseau horaire que nous voulons vérifier et nous pouvons savoir si ce fuseau horaire est l'heure d'été / ce que le décalage est. Vous devrez ensuite vérifier le décalage contre GMT pour voir si vous voulez envoyer votre e-mail maintenant, ou pas maintenant.

Créé 27/05/2011 à 17:40
source utilisateur

voix
23

Avez-vous besoin de connaître tous les détails de l'heure d'été vous la transition? ou avez-vous avez juste besoin de savoir quand est 9h00 dans un fuseau horaire donné?

Si c'est la dernière, PHP peut utiliser la base de données de fuseau horaire de votre système d'exploitation pour le faire pour vous. Le strtotime () fonction est remarquablement bien à « déterminer » ce que vous entendez:

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

Assurez - vous que vous utilisez l' un des décalages horaires supportés PHP .

Créé 27/05/2011 à 19:40
source utilisateur

voix
19

Comme Jimmy indique que vous pouvez utiliser des transitions de fuseau horaire, mais ce n'est pas disponible sur PHP <5.3. comme DateTimeZone () est PHP> = 5.2.2 mais getTransitions () avec des arguments ne sont pas! Dans ce cas, est ici une fonction qui peut vous donner des données de fuseau horaire, y compris si l'heure d'été dans ou non.

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

Cela dit, il existe une méthode plus simple par date () si vous avez juste besoin de savoir si un fuseau horaire est l'heure d'été. Par exemple, si vous voulez savoir si Royaume-Uni est en heure d'été, vous pouvez le faire:

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

... ou fournir un horodatage en tant que deuxième arg à ce jour () si vous souhaitez spécifier un datetime autre que votre temps de serveur actuel.

Créé 14/06/2012 à 13:02
source utilisateur

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