2009-09-18 14 views
5

C'è un sacco di informazioni su come eseguire le regolazioni dei fusi orari in PHP, ma non ho trovato una risposta specifica per quello che voglio fare a causa di tutto il rumore.Regolazione del fuso orario in PHP con DateTime/DateTimeZone

Dato un orario in un fuso orario, voglio convertirlo all'ora in un altro fuso orario.

This è essenzialmente ciò che voglio fare, ma devo essere in grado di farlo utilizzando solo le librerie PHP integrate, non PEAR Date.

Questo è quello che ho fatto, ma mi sembra dare sempre il relativo offset GMT:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles'); 
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu'); 

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

Questa è l'uscita:

LA Time: 2009-09 -18T05: 00: 00-07: 00
Offset: -36000

mi aspettavo 3 ore (10.800 secondi). ma la cosa '-7: 00' mi dice che sta mantenendo tutto relativo al GMT, il che forse spiega perché mi sta dando l'offset "assoluto".

Come faccio a ottenere l'offset tra i due fusi orari senza tutto questo GMo hoohah?

Grazie.

UPDATE:

mi venne in mente che avrei potuto fare questo e ottenere ciò che voglio:

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone); 
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM)); 


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

ma ci si sente scomodo per me. Qualcuno sa un modo più pulito per farlo?

risposta

8

Ecco un paio di funzioni che utilizzano le classi DateTime. Il primo restituirà la differenza in secondi tra due fusi orari. Il secondo restituisce una "traduzione" del tempo da un fuso orario all'altro.

function timezone_diff($tz_from, $tz_to, $time_str = 'now') 
{ 
    $dt = new DateTime($time_str, new DateTimeZone($tz_from)); 
    $offset_from = $dt->getOffset(); 
    $timestamp = $dt->getTimestamp(); 
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset(); 
    return $offset_to - $offset_from; 
} 

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $timestamp = $dt->getTimestamp(); 
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format); 
} 

Demo:

$los_angeles_time = '2009-09-18 05:00:00'; 
$los_angeles_tz = 'America/Los_Angeles'; 
$hawaii_tz  = 'Pacific/Honolulu'; 

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $los_angeles_hawaii_diff . '<br />'; 

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $hawaii_time . '<br />'; 
+0

Per inciso :), questi sono per PHP> = 5.3.0. – GZipp

+0

Non sembrano prendere in considerazione l'ora legale. Sto usando le funzioni di cui sopra per trasformare CST in GMT e tutti i miei tempi sono fuori di 1 ora. –

0

Semplicemente meno la prima volta dal secondo.

Che sarete in grado di ottenere la differenza di tempo in termini di secondi.

1

Come ha commentato GZipp, il suo codice è in realtà solo per PHP> = 5.3.0. Va bene, ma - ecco una versione che funzionerà in PHP> = 5.2.0. (Per inciso, funziona anche in 5.3+ e con 2 chiamate di funzione in meno)

<?php 
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $dt->setTimezone(new DateTimezone($tz_to)); 
    return $dt->format($format); 
} 

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month'); 

foreach ($time_diffs as $diff) 
{ 
echo "{$diff}:" 
    . "\n\t" 
    . "Current: " . date("Y-m-d H:i:s", strtotime($diff)) 
    . "\n\t" 
    . "UTC: " . time_translate("US/Eastern", "UTC", $diff) 
    . "\n\n"; 
} 
+0

Grazie mille, funziona con la versione 5.2 di php. Ma se voglio andare con minuto e secondo diff allora quali dovrebbero essere i miei parametri. Significa in una serie di differenze temporali. – user3305818

+0

il parametro '$ diff' (' $ time_str') è semplicemente una stringa che 'strtotime' capisce, che restituisce un timestamp unix appropriato. Quindi passa "1 minuto o" "" -1 secondo "o qualunque intervallo tu voglia.Lo scopo di questa domanda/risposta non era quello di calcolare le differenze nel tempo o spiegare l'uso di ['strtotime'] (http://php.net/strtotime), è per convertire un tempo in un fuso orario nell'ora locale in un altro fuso orario. –

+0

Le sue opere. Ma ora se voglio fornire tutti i parametri come, 1 giorno, 3 ore, 10 minuti e 20 secondi prima. Dimmelo, ti prego. – user3305818