2013-05-25 15 views
10

J'ai un horodatage unix réglé sur +5, mais je voudrais le convertir en -5, EST Standard time. Je voudrais juste que l'horodatage soit généré dans ce fuseau horaire, mais je le saisis d'une autre source qui le met à +5.Convertir un horodatage Unix en fuseau horaire?

actuel non modifié Timestamp être converti en une date

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

Répondre

30

Utilisez DateTime et 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

travaillé parfait. Merci =) –

+0

Corrigez-moi si je me trompe @John Sûrement cela ne fonctionne pas? Cette méthode utiliserait le fuseau horaire par défaut du système (PHP Config) ne l'ayant pas spécifié lors de la création de l'instance de l'objet DateTime. Comme [ici] (http://stackoverflow.com/a/17098897/234631). Donc, lors de la conversion en Amérique/Chicago, il serait modifié par rapport au fuseau horaire du système en supposant que ce n'est pas le même que +5 comme l'horodatage UNIX lui-même qu'il essaie de modifier de ~ 10 zones? –

+1

@Stefan C'est en effet faux. Les horodatages Unix sont toujours UTC. Quelques exemples de code amusant: ini_set ('date.timezone', 'America/Los_Angeles'); $ maintenant = heure(); $ utc = new DateTime ("@ {$ now}", nouvelle 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}", nouvelle DateTimeZone ('UTC')); echo "{$ utc-> format ('c')} \ n"; // 2014-08-27T15: 24: 09 + 00: 00 –

0

En raison file d'attente d'édition pour John Conde's answer est plein je vais ajouter plus de détails répondre.

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

Le paramètre fuseau horaire de $ et le fuseau horaire actuel sont ignorés lorsque le $ paramètre de temps est soit un horodatage UNIX (par exemple @ 946684800) ...

C'est la raison principale pour laquelle vous devez toujours spécifier timezone, même par défaut, lors de la création d'objets DateTime à partir d'un horodatage unix. Voir explique le code inspiré par 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 plus facile façon de le faire est la suivante:

En utilisant gmdate(), ajoutez votre fuseau horaire en quelques secondes pour unix_stamp en gmdate.

Considérer mon fuseau horaire est GMT + 5: 30. Donc 5 h 30 min en secondes sera

Alors, je ferai ceci:

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

Questions connexes