PHP ahorro de tiempo de detección de la luz del día

votos
25

Tengo que enviar un correo electrónico a los usuarios basados ​​en cualquier parte del mundo a las 9:00 am hora local. El servidor se encuentra en el Reino Unido. Lo que puedo hacer es crear una diferencia de tiempo entre cada usuario y la hora del servidor, que luego funcione a la perfección si no existiera el horario de verano.

He aquí un ejemplo para ilustrarlo:

  • John trabaja en Nueva York, -5 horas a partir de la hora del servidor (Reino Unido)
  • Richard trabaja en Londres, Reino Unido, por lo que 0 hora de diferencia con el servidor.

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

Este escenario todavía puede manejar mediante la actualización de todos los usuarios fuera de la hora local del servidor, pero una vez que me he movido hacia delante / atrás el tiempo de todos los demás usuarios, todavía necesito una manera de detectar cuando (fecha y hora) los usuarios que viven fuera del Reino Unido será (o no) cambiar su hora local para una probable un horario de verano.

Necesito un método PHP saber / detectar cuando otras partes del mundo entrarán / DST salida.

Publicado el 27/05/2011 a las 17:35
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
12

Cambiar mi respuesta un poco: DateTimeZone :: getTransitions parece que va a hacer lo que tiene, siempre que disponga de PHP> = 5.2.

A partir 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 en la zona horaria que desea comprobar y podemos saber si esa zona horaria está en el horario de verano / lo que el desplazamiento es. A continuación, tendrá que comprobar la compensación contra GMT para ver si desea enviar su correo electrónico ahora, o no ahora.

Respondida el 27/05/2011 a las 17:40
fuente por usuario

votos
23

¿Es necesario conocer todos los detalles de la transición DST ti mismo? o sólo necesita saber cuando son las 9:00 de la mañana en una zona horaria determinada?

Si es esto último, PHP puede utilizar la base de datos de zona horaria del sistema operativo para hacer eso por usted. El strtotime () función es muy bueno en "averiguar" lo que quiere decir:

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

Sólo asegúrese de que está utilizando una de las zonas horarias PHP apoyado .

Respondida el 27/05/2011 a las 19:40
fuente por usuario

votos
19

Como señala Jimmy puede utilizar transiciones de zona horaria, pero esto no está disponible en PHP <5.3. como DateTimeZone () es PHP> = 5.2.2, pero getTransitions () con argumentos no es! En ese caso, aquí es una función que le puede dar los datos de zona horaria, incluyendo ya sea en el 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;
}

Una vez dicho esto, hay un método más simple usando fecha () si sólo necesita saber si una zona horaria está en el horario de verano. Por ejemplo, si desea saber si el Reino Unido está en el horario de verano se puede hacer esto:

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

... o suministrar una marca de tiempo como un segundo arg hasta la fecha () si desea especificar una fecha y hora que no sea su hora actual del servidor.

Respondida el 14/06/2012 a las 13:02
fuente por usuario

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