2013-05-25 8 views
10

Ho un timestamp unix impostato a +5, ma mi piacerebbe convertirlo in -5, ora standard EST. Vorrei solo far generare il timestamp in quel fuso orario, ma lo sto prendendo da un'altra fonte che lo sta mettendo a +5.Converti timestamp Unix in fuso orario?

attuale non modificato timestamp che si trasforma in Data

<? echo gmdate("F j, Y, g:i a", 1369490592) ?> 

risposta

30

Usa DateTime e DateTimeZone:

$dt = new DateTime('@1369490592'); 
$dt->setTimeZone(new DateTimeZone('America/Chicago')); 
echo $dt->format('F j, Y, g:i a'); 

See it in action

+3

ha funzionato perfettamente. Grazie =) –

+0

Correggimi se sbaglio @John Sicuramente questo non funziona? Questo metodo utilizza il timezone predefinito di sistemi (PHP Config) che non lo ha specificato durante la creazione dell'istanza dell'oggetto DateTime. Mi piace [qui] (http://stackoverflow.com/a/17098897/234631). Quindi, quando si converte in America/Chicago, sarebbe alterato rispetto al fuso orario del sistema assumendo che non sia lo stesso di +5 come il timestamp UNIX stesso che sta cercando di alterare di ~ 10 zone? –

+1

@Stefan Questo è davvero sbagliato. I timestamp Unix sono sempre UTC. Alcuni esempi divertenti di codice: ini_set ('date.timezone', 'America/Los_Angeles'); $ now = time(); $ utc = new DateTime ("@ {$ now}", nuovo DateTimeZone ('America/New_York')); echo "{$ utc-> format ('c')} \ n"; // 2014-08-27T15: 24: 09 + 00: 00 $ utc = new DateTime ("@ {$ now}"); echo "{$ utc-> format ('c')} \ n"; // 2014-08-27T15: 24: 09 + 00: 00 ini_set ('date.timezone', 'UTC'); $ utc = new DateTime ("@ {$ now}", nuovo DateTimeZone ('UTC')); echo "{$ utc-> format ('c')} \ n"; // 2014-08-27T15: 24: 09 + 00: 00 –

0

Come a causa della coda di modifica per John Conde's answer è pieno io aggiungerò più dettagliate risposta.

Da DateTime::__construct(string $time, DateTimeZone $timezone)

Il parametro $ fuso orario e il fuso orario corrente vengono ignorati quando il $ parametro temporale o è un timestamp di UNIX (ad esempio @ 946.684.800) ...

Questo è il il motivo principale per cui è necessario specificare sempre il fuso orario, anche predefinito, durante la creazione di oggetti DateTime da timestamp unix. Vedere spiegato codice ispirato John Conde's answer:

$dt = new DateTime('@1369490592'); 

// use your default timezone to work correctly with unix timestamps 
// and in line with other parts of your application 
date_default_timezone_set ('America/Chicago'); // somewhere on bootstrapping time 
… 
$dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); 

// set timezone to convert time to the other timezone 
$dt->setTimeZone(new DateTimeZone('America/Chicago')); 

echo $dt->format('F j, Y, g:i a'); 
0

Un più facile modo per farlo è:

Durante l'utilizzo gmdate(), aggiungere il fuso orario in secondi per unix_stamp in gmdate.

Considerare il mio fuso orario è GMT + 5: 30. Così 5 ore 30 min in pochi secondi sarà

Quindi, farò questo:

gmdate("F j, Y, g:i a", 1369490592+19800)