2010-05-14 9 views
2

Je suis en train de stocker des temps en utilisant la fonction 'time()' dans la base de données. Cependant, il utilise le fuseau horaire du serveur, et j'aimerais que chaque utilisateur voit l'heure en fonction de son fuseau horaire (défini dans son profil).PHP: Comment convertir un horodatage de serveur en fuseau horaire?

Comment effectuer la conversion d'horodatage? (et je veux dire de l'horodatage à l'horodatage, pas à l'heure lisible)

Répondre

9

Comme Joonas dit, timestamps UNIX sont par définition UTC, mais vous pouvez pirater quelque chose comme ça ensemble pour mimer horodatages spécifiques à fuseau horaire si vous avez vraiment besoin:

// PHP 5.3 - OO Code 
$timestamp = time(); 
echo 'Unix timestamp: ' . $timestamp; 
$dt = DateTime::createFromFormat('U', $timestamp); 
$dt->setTimeZone(new DateTimeZone('America/New_York')); 
$adjusted_timestamp = $dt->format('U') + $dt->getOffset(); 
echo ' Timestamp adjusted for America/New_York: ' . $adjusted_timestamp; 

// PHP 5.3 - Procedural Code 
$timestamp = time(); 
echo 'Unix timestamp: ' . $timestamp; 
$dt = date_create_from_format('U', $timestamp); 
date_timezone_set($dt, new DateTimeZone('America/New_York')); 
$adjusted_timestamp = date_format($dt, 'U') + date_offset_get($dt); 
echo ' Timestamp adjusted for America/New_York: ' . $adjusted_timestamp; 
+0

Merci, mais j'obtiens cette erreur 'Appel à la méthode indéfinie DateTime :: createfromformat()'. Comment se fait-il que ce ne soit pas défini? – KeyStroke

+0

Quelle version de PHP utilisez-vous? – Mike

+3

Ce code nécessite probablement PHP 5.3 –

1

Les horodatages UNIX sont par définition en UTC, ce qui signifie que toute la conversion doit être effectuée juste avant l'impression plutôt qu'avec des horodatages réels. Cependant, cela dépend de la façon dont vous les formatez actuellement. Je crois que PHP a intégré la gestion du fuseau horaire.

+0

J'ai trouvé quelques fonctions, mais aucun d'entre eux convertir l'horodatage lui-même à un fuseau horaire différent. Je fais beaucoup d'opérations sur l'horodatage de la base de données, donc spécifier le fuseau horaire à chaque fois que je produis l'heure est un peu trop de travail. – KeyStroke

2

Vraiment vous ne devriez pas être Hacking les horodatages eux-mêmes pour changer la date à l'intérieur, vous devez simplement appliquer le fuseau horaire à l'horodatage avant de présenter l'horodatage formaté à l'utilisateur.

Ceci est une version modifiée du code de Mike qui devrait fonctionner pour PHP 5> = 5.2.0 que l'on trouve sur php.net

// OO Code 
$st = 1170288000 // a timestamp 
$dt = new DateTime("@$st"); 
$dt->setTimeZone(new DateTimeZone('America/New_York')); 
$adjusted_timestamp = $dt->format('U') + $dt->getOffset(); 
echo ' Timestamp adjusted for America/New_York: ' . $adjusted_timestamp; 

// Procedural Code 
$st = 1170288000 // a timestamp 
$dt = date_create("@$st"); 
date_timezone_set($dt, timezone_open('America/New_York')); 
$adjusted_timestamp = date_format($dt, 'U') + date_offset_get($dt); 
echo ' Timestamp adjusted for America/New_York: ' . $adjusted_timestamp;