Détection de l'heure D'été et de L'heure D'hiver

j'ai besoin d'envoyer un email aux utilisateurs basés n'importe où dans le monde à 9:00 heure locale. Le serveur est au royaume-UNI. Ce que je peux faire est de configurer un décalage horaire entre chaque utilisateur et le temps du serveur, qui fonctionnerait alors parfaitement si DST n'existait pas.

Voici un exemple pour l'illustrer:

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

lorsque le serveur passe de GMT à GMT +1 (BST) à 2:00am un certain dimanche, cela signifie que John a maintenant un décalage horaire de-6H.

ce scénario je peux encore gérer en mettant à jour tous les utilisateurs en dehors de l'heure locale du serveur, mais une fois que j'ai avancé/reculé l'Heure de tous les autres utilisateurs, j'ai encore besoin d'un moyen de détecter quand (heure et date) les utilisateurs vivant à l'extérieur du royaume-UNI sera (ou ne sera pas) changer l'heure locale pour une probable de l'heure d'été.

j'ai besoin d'une méthode PHP pour savoir/détecter quand d'autres parties du monde vont entrer/sortir DST.

26
demandé sur halfer 2011-05-27 20:35:44

3 réponses

avez-vous besoin de connaître tous les détails de transition DST vous-même? ou avez-vous juste besoin de savoir quand est 9h00 dans un fuseau horaire donné?

si C'est ce dernier, PHP peut utiliser la base de données timezone de votre système d'exploitation pour faire cela pour vous. strtotime () la fonction est remarquablement bonne pour "comprendre" ce que vous voulez dire:

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

assurez-vous simplement que vous utilisez l'un des fuseaux horaires supportés par PHP.

24
répondu squirrel 2011-05-27 18:40:22
=5.2.2 mais getTransitions () avec arguments n'est pas! Dans ce cas, voici une fonction qui peut vous donner des données de fuseau horaire, que ce soit en DST 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 y a une méthode plus simple utilisant date() si vous avez juste besoin de savoir si un fuseau horaire est en DST. Par exemple, si vous voulez savoir si le Royaume-Uni est dans DST vous pouvez faire ceci:

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

... ou fournir une horodatage comme second arg à date() si vous voulez spécifier une datetime autre que l'Heure de votre serveur courant.

19
répondu Owen 2012-06-14 12:24:32

changer un peu ma réponse: DateTimeZone:: getTransitions on dirait qu'il fera ce dont vous avez besoin, à condition que vous ayez PHP >= 5.2.

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

donc ici, tout ce que nous avons à faire est de passer dans le fuseau horaire que nous voulons vérifier et nous pouvons savoir si ce fuseau horaire est en DST/ce qu'est l'offset. Vous aurez alors besoin de vérifier le décalage par rapport à GMT pour voir si vous voulez envoyer votre e-mail maintenant, ou pas maintenant.

12
répondu Jimmy Sawczuk 2013-01-07 11:45:02