2009-09-18 5 views
5

Il ya beaucoup d'informations sur les ajustements de fuseau horaire en PHP, mais je n'ai pas trouvé de réponse pour ce que je veux faire précisément à cause de tout le bruit.Ajustement du fuseau horaire en PHP avec DateTime/DateTimeZone

Étant donné une heure dans un fuseau horaire, je veux convertir à l'heure dans un autre fuseau horaire.

This est essentiellement ce que je veux faire, mais je dois être capable de le faire en utilisant seulement les bibliothèques PHP intégrées, pas la date PEAR.

C'est ce que je fais, mais il me semble toujours donner le décalage par rapport à l'heure GMT:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles'); 
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu'); 

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

C'est la sortie:

LA Heure: 2009-09 -18T05: 00: 00-07: 00
Offset: -36000

Je me attendais à 3 heures (10800 secondes). mais le truc '-7: 00' me dit qu'il garde tout par rapport à GMT, ce qui explique peut-être pourquoi il me donne le décalage "absolu".

Comment puis-je obtenir le décalage entre les deux fuseaux horaires sans tout ce GMT hoohah?

Merci.

MISE À JOUR:

Je me est survenue lors que je pouvais le faire et d'obtenir ce que je veux:

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone); 
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM)); 


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

Mais il se sent maladroit pour moi. Quelqu'un sait-il une manière plus propre de le faire?

Répondre

8

Voici quelques fonctions utilisant les classes DateTime. Le premier retournera la différence en secondes entre deux fuseaux horaires. La seconde renvoie une "traduction" de l'heure d'un fuseau horaire à un autre.

function timezone_diff($tz_from, $tz_to, $time_str = 'now') 
{ 
    $dt = new DateTime($time_str, new DateTimeZone($tz_from)); 
    $offset_from = $dt->getOffset(); 
    $timestamp = $dt->getTimestamp(); 
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset(); 
    return $offset_to - $offset_from; 
} 

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $timestamp = $dt->getTimestamp(); 
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format); 
} 

Démo:

$los_angeles_time = '2009-09-18 05:00:00'; 
$los_angeles_tz = 'America/Los_Angeles'; 
$hawaii_tz  = 'Pacific/Honolulu'; 

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $los_angeles_hawaii_diff . '<br />'; 

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $hawaii_time . '<br />'; 
+0

Incidemment, :), ce sont pour PHP> = 5.3.0. – GZipp

+0

Ils ne semblent pas prendre en compte l'heure d'été. Im en utilisant les fonctions ci-dessus pour transformer CST en GMT et tous mes temps sont hors de 1 heure. –

0

Simplement moins la première fois par rapport à la seconde.

Cela vous permettra d'obtenir le décalage horaire en termes de secondes.

1

Comme GZipp a commenté, son code est vraiment seulement pour PHP> = 5.3.0. C'est bien, mais - voici une version qui fonctionnera en PHP> = 5.2.0. (Incidemment, il fonctionne également dans 5.3+, et avec 2 appels de fonction moins)

<?php 
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $dt->setTimezone(new DateTimezone($tz_to)); 
    return $dt->format($format); 
} 

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month'); 

foreach ($time_diffs as $diff) 
{ 
echo "{$diff}:" 
    . "\n\t" 
    . "Current: " . date("Y-m-d H:i:s", strtotime($diff)) 
    . "\n\t" 
    . "UTC: " . time_translate("US/Eastern", "UTC", $diff) 
    . "\n\n"; 
} 
+0

Merci beaucoup, il fonctionne avec la version php 5.2. Mais si je veux aller avec des minutes et des secondes, alors quels devraient être mes paramètres. Moyens dans le tableau des diffs de temps. – user3305818

+0

Le paramètre '$ diff' (' $ time_str') est simplement une chaîne que 'strtotime' comprend, ce qui retournera un horodatage unix approprié. Il suffit donc de passer "-1 minute" ou "-1 seconde" ou l'intervalle que vous voulez.Le but de cette question/réponse n'était pas de calculer les différences de temps ni d'expliquer l'utilisation de ['strtotime'] (http://php.net/strtotime), c'est de convertir une heure dans un fuseau horaire à l'heure locale en un autre fuseau horaire. –

+0

Ses travaux. Mais maintenant, si je veux fournir tous les paramètres comme, 1 jour, 3 heures, 10 minutes et 20 secondes avant. S'il vous plaît dites-moi. – user3305818