PHP detección de horario de verano


Necesito enviar un correo electrónico a los usuarios basados en cualquier parte del mundo a las 9:00 am hora local. El servidor está en el Reino Unido. Lo que puedo hacer es configurar una diferencia de tiempo entre cada usuario y la hora del servidor, que entonces funcionaría perfectamente si el horario de verano no existiera.

Aquí hay un ejemplo para ilustrarlo:

  • John trabaja en Nueva York, -5 horas desde el servidor (Reino Unido) tiempo
  • Richard trabaja en Londres, Reino Unido, así que 0 horas de diferencia con el servidor.

Cuando el servidor pasa de GMT a GMT +1 (BST)a las 2: 00am de un domingo determinado, esto significa que John ahora tiene una diferencia horaria de-6H.

Este escenario todavía puedo manejar actualizando a todos los usuarios fuera de la hora local del servidor, pero una vez que he avanzado/retrocedido la hora de todos los demás usuarios, todavía necesito una forma de detectar cuando (hora y fecha) los usuarios que viven fuera del Reino Unido cambiarán (o no) su hora local a una probable hora de verano.

Necesito un método PHP para saber / detectar cuando otro partes del mundo entrarán/saldrán del horario de verano.

Author: halfer, 2011-05-27

3 answers

¿Necesita conocer todos los detalles de la transición del horario de verano usted mismo? ¿o solo necesita saber cuándo son las 9: 00 am en una zona horaria determinada?

Si es lo último, PHP puede usar la base de datos de zonas horarias de su sistema operativo para hacerlo por usted. La función strtotime () es notablemente buena para "averiguar" lo que quieres decir:

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

Solo asegúrate de usar una de las zonas horarias soportadas por PHP.

 24
Author: squirrel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-27 18:40:22

Como Jimmy señala, puede usar transiciones de zona horaria, pero esto no está disponible en PHP =5.2.2 pero getTransitions () con argumentos no lo es! En ese caso, aquí hay una función que puede darle datos de zona horaria, incluso si está en horario de verano o no.

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

Dicho esto, hay un método más simple que usa date() si solo necesita saber si una zona horaria está en DST. Por ejemplo, si quieres saber si el Reino Unido está en horario de verano puedes hacer esto:

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

... o proporcione una marca de tiempo como un segundo arg to date () si desea especificar una fecha y hora distinta de la hora actual del servidor.

 19
Author: Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-14 12:24:32

Cambiando un poco mi respuesta: DateTimeZone::getTransitions parece que hará lo que necesita, siempre que tenga PHP >= 5.2.

De un comentario en la documentación:

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

Así que aquí, todo lo que necesitamos hacer es pasar la zona horaria que queremos comprobar y podemos saber si esa zona horaria está en horario de verano/cuál es el desplazamiento. A continuación, tendrá que comprobar el desplazamiento contra GMT para ver si desea enviar su correo electrónico ahora, o no ahora.

 12
Author: Jimmy Sawczuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-07 11:45:02