PHP legale rilevamento in tempo

voti
25

Ho bisogno di inviare una e-mail agli utenti in base ovunque nel mondo alle 9:00 del mattino ora locale. Il server è nel Regno Unito. Quello che posso fare è impostare una differenza di tempo tra ogni utente e l'ora del server, che sarebbe quindi funzionare perfettamente se l'ora legale non esistesse.

Ecco un esempio per illustrare esso:

  • John lavora a New York, -5 ore dalla (UK) ora del server
  • Richard lavora a Londra, Regno Unito, quindi 0 differenza di tempo con il server.

Quando il server va da GMT a GMT +1 (BST) alle 2:00 am su un certo Domenica, questo significa che John ha ora una differenza di tempo -6h ora.

Questo scenario mi può ancora gestire aggiornando tutti gli utenti al di fuori ora locale del server, ma una volta che ho spostato in avanti / indietro il tempo di tutti gli altri utenti, ho ancora bisogno di un modo per rilevare quando (data e ora) gli utenti che vivono fuori del Regno Unito sarà (o non vuole) cambiare il loro tempo locale per una probabile DST uno.

Ho bisogno di un metodo di PHP per sapere / rilevare quando in altre parti del mondo saranno entrare / uscire DST.

È pubblicato 27/05/2011 alle 17:35
fonte dall'utente
In altre lingue...                            


3 risposte

voti
12

Cambiare la mia risposta un po ': DateTimeZone :: getTransitions sembra che farà ciò che è necessario, purché si disponga di PHP> = 5.2.

Da un commento nella documentazione:

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

Così qui, tutto quello che dobbiamo fare è passare nel fuso orario che vogliamo controllare e possiamo sapere se questo fuso orario è in ora legale / ciò che l'offset è. Avrete quindi bisogno di controllare l'offset contro GMT per vedere se si desidera inviare la posta elettronica ora, o non ora.

Risposto il 27/05/2011 a 17:40
fonte dall'utente

voti
23

Avete bisogno di conoscere tutti i dettagli della transizione DST te stesso? o avete solo bisogno di sapere quando sono le ore 9:00 in un determinato fuso orario?

Se si tratta di quest'ultimo, PHP può utilizzare database di fuso orario del sistema operativo di farlo per voi. Lo strtotime () funzione è straordinariamente bravo a "capire" cosa vuoi dire:

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

Basta fare in modo che si sta utilizzando uno dei PHP supportato fusi orari .

Risposto il 27/05/2011 a 19:40
fonte dall'utente

voti
19

Come Jimmy sottolinea è possibile utilizzare le transizioni di fuso orario, ma questo non è disponibile su PHP <5.3. come DateTimeZone () è PHP> = 5.2.2, ma getTransitions () con argomenti non è! In tal caso, qui è una funzione che può dare i dati di fuso orario, compreso se in ora legale o meno.

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

Detto questo, c'è un metodo più semplice con data () se avete solo bisogno di sapere se un fuso orario è in ora legale. Per esempio, se si vuole sapere se nel Regno Unito è in ora legale si può fare questo:

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

... o di fornire un timestamp come secondo arg ad oggi () se si desidera specificare un datetime diverso il tempo corrente del server.

Risposto il 14/06/2012 a 13:02
fonte dall'utente

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