2009-10-13 4 views
5

Je vous ai lu comment faire cela toute la matinée, et le consensus général est le suivant: stockez vos horodatages en UTC et calculez le décalage à partir de là. Cependant, comme la plupart des gens, je maintiens une base de code existante et je ne peux pas changer la façon dont nous stockons nos dates. Au moins, pas dans le délai imparti.Affichage des fuseaux horaires sans utiliser l'UTC

Donc, ma question est, puis-je faire quelque chose comme ça en toute sécurité?

// this is my time zone 
$timestamp = strtotime($timestampFromDatabase); 
date_default_timezone_set('America/New York'); 
$tz = date_default_timezone_get(); 

// this is theoretically their timezone, which will eventually 
// be taken from a session variable 
date_default_timezone_set('Europe/Paris'); 
$offset = time() - $timestamp; 
$timestamp -= $offset; 

// now that I have the offset, display dates like this 
date('r', $timestamp); 

Certaines personnes ont déconseillé de faire des calculs de dates, mais est ce que je fais ici mal? Y a-t-il un meilleur moyen? Y a-t-il des pièges à surveiller? Je suis particulièrement intéressé par le genre de bugs que cette méthode pourrait produire, et le cas échéant, qui vont-ils affecter?

Mon patron est le genre de gars qui ne se soucie pas si le bogue affecte seulement 1% de la base d'utilisateurs.

Éditer: Puis-je clarifier cela? Je ne semble pas avoir trop de preneurs à ce sujet. N'importe qui? Même une suggestion vague ou un lien serait extrêmement utile.

Répondre

5

La réponse courte est que les fuseaux horaires sont difficiles à travailler et personne ne veut s'attaquer aux questions difficiles!

Plus, la réponse est la suivante:

Tout d'abord, vous devez créer une représentation de date, dans leurs fuseaux horaires actuels. Les éléments suivants sont équivalents:

date_default_timezone_set('America/New York'); 

$date = new DateTime(null); 

OU

$date = new DateTime(null, new DateTimeZone('America/New York')); 

Cela vous donne une date avec zone réglée en Amérique/New York. Nous pouvons facilement convertir au fuseau horaire de l'utilisateur, dans ce cas, l'Europe/Paris avec la ligne suivante:

$date->setTimezone(new DateTimeZone('Europe/London')); 

Vous pouvez utiliser la ligne suivante pour obtenir la date/heure représentée à tout moment.

echo $date->format('d/m/Y H:i:s'); 

Je fortement recommander ce sur l'arithmétique, comme construit dans les fonctions PHP ont connaissance des temps et l'heure d'été beaucoup de choses compliquées que vous n'obtenir le droit.


Mon script de test en entier:

date_default_timezone_set('America/Belize'); 

$date = new DateTime(null); 

echo $date->format('d/m/Y H:i:s') . '<br>'; 

$date->setTimezone(new DateTimeZone('Europe/London')); 

echo $date->format('d/m/Y H:i:s') . '<br>'; 
+0

Vous pouvez également utiliser cette approche pour mettre à jour votre base de données UTC dans un hors emploi pour une utilisation future. –

+0

C'est génial. Cependant, supposons que je cours PHP 5.14, qui n'a pas cet objet. Y a-t-il un autre moyen? –

+0

Zend Framework a une solution basée sur PHP dans Zend_Date, mais demande PHP 5.2.4 comme une exigence générale pour le framework. Cela peut fonctionner. Pouvez-vous mettre à jour ou recompiler PHP? –