2011-04-27 14 views
17

Server EnvironmentPHP UTC in ora locale

Redhat Enterprise Linux
PHP 5.3.5

Problema

Diciamo che ho un giorno e ora UTC quali 2011-04 -27 02:45 e voglio convertire nella mia ora locale, che è America/New_York.

Tre domande:

1.) Il mio codice di seguito potrebbe risolvere il problema, sei d'accordo?

<?php 

date_default_timezone_set('America/New_York'); // Set timezone. 

$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

// Timezone offset in seconds. The offset for timezones west of UTC is always negative, 
// and for those east of UTC is always positive. 
$offset = date("Z"); 

$local_ts = $utc_ts + $offset; // Local Unix timestamp. Add because $offset is negative. 

$local_time = date("Y-m-d g:i A", $local_ts); // Local time as yyyy-mm-dd h:m am/pm. 

echo $local_time; // 2011-04-26 10:45 PM 

?> 

2.) Tuttavia, il valore di $ offset si adegua automaticamente all'ora legale (DST)?
3.) In caso contrario, come dovrei modificare il mio codice per regolare automaticamente l'ora legale?

Grazie :-)

+2

Hai provato? – wallyk

+0

'date (" Z ")' restituisce sempre il fuso orario 'GMT + 0000', che non ha correzioni per l'ora legale. –

risposta

32

Questo farà ciò che si vuole utilizzare phps nativi DateTime e DateTimeZone classi:

$utc_date = DateTime::createFromFormat(
       'Y-m-d G:i', 
       '2011-04-27 02:45', 
       new DateTimeZone('UTC') 
); 

$nyc_date = $utc_date; 
$nyc_date->setTimeZone(new DateTimeZone('America/New_York')); 

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM 

Vedi DateTime::createFromFormat man page per ulteriori informazioni.

Dopo alcuni esperimenti tra time zones that do and do not currently have DST ho scoperto che questo terrà conto dell'ora legale. La stessa conversione con il mio metodo sopra restituisce lo stesso tempo risultante.

+1

Questo è anche il motivo per cui PHP ha 7 diversi fusi orari per lo stato dell'Indiana, per tenere conto di tutte le loro pazze regole DST: http://php.net/manual/en/timezones.php –

+0

Tutti: apprezzo molto l'aiuto di tutti . Treffynnon: grazie! Farò un tentativo. Il mio codice sembra così primitivo rispetto al tuo, lol. Ero ancora vicino nel mio tentativo? Grazie ancora! – John

+0

@John contento che ti piaccia. Non sono sicuro del tuo codice in quanto non l'ho mai scritto in questo modo con lo stile procedurale di PHP. – Treffynnon

0
date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

Subito dopo questa esecuzione di questo, $ utc_ts contiene l'ora locale. PHP gestisce lo stesso DST.

= H =

+1

Questo non consente di convertire l'ora tra fusi orari. Crea solo un nuovo timestamp unix per '2011-04-27 02: 45'. Il fuso orario nell'esempio non fa nulla in questo caso ed è irrilevante. – Treffynnon

+2

Non esiste una cosa come la data/ora UTC perché il timestamp non è influenzato dal fuso orario. Puoi impostare qualsiasi fuso orario nella prima riga e $ utc_ts restituirà lo stesso valore.Questo codice non fa altro che impostare il fuso orario per l'uso futuro nello script, non influenza il timestamp stesso. – Wh1T3h4Ck5

3

So che questo è un vecchio post, ma c'è un'altra riga che è necessario aggiungere per ottenere l'ora corretta.

Prima di convertire in ora locale, è necessario impostare il fuso orario predefinito per UTC come questo (se è il fuso orario del tempo si sta fornendo):

function GmtTimeToLocalTime($time) { 
    date_default_timezone_set('UTC'); 
    $new_date = new DateTime($time); 
    $new_date->setTimeZone(new DateTimeZone('America/New_York')); 
    return $new_date->format("Y-m-d h:i:s"); 
} 
0

sarò migliorare Hasin la risposta di Hayder

date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45 UTC"); // UTC Unix timestamp. 
echo date('Y-m-d H:i:s a T', $utc_ts); 

dovrebbe uscita

2011-04-26 10:45:00 pm EDT 

la differenza è l'aggiunta della s ource Timezone. strtotime() accetta anche il fuso orario, lo sai! : p

Problemi correlati