2017-09-18 4 views
0

J'ai besoin de calculer la différence d'heures entre deux fuseaux horaires et je rencontre des problèmes lorsque le fuseau horaire qui précède est déplacé au jour suivant.Calcul de la différence de temps en heures entre deux fuseaux horaires

Exemple:

//Let's say it is 11pm 23:00 in LA 
$local_tz = new DateTimeZone('America/Los_Angeles'); 
$local = new DateTime('now', $local_tz); 
$local_hour = $local->format('H'); 

//NY is 3 hours ahead, so it is 2am, 02:00 
$user_tz = new DateTimeZone('America/New_York'); 
$user = new DateTime('now', $user_tz); 
$user_hour = $user->format('H'); 

Suivant l'exemple dans cette question (Calculate hours between dates in different time zones) Je reçois un résultat incorrect:

$diff = $user_tz->getOffset($local); 
error_log('$diff '.gmdate("H:i:s", $diff)); //outputs 20:00:00 

S'il était 16 heures à Los Angeles, donc 19 heures à New York, alors il est facile :

$time_diff = ($user_h - $local_h); //$time_diff = 3; 

Mais quand NY se déplace au lendemain, je reçois à nouveau des résultats incorrects:

$time_diff = ($user_h - $local_h); //$time_diff = -21; 

Comment puis-je comptabiliser un autre fuseau horaire qui a été déplacé vers un nouveau jour?

+1

'$ time_diff = $ time_diff> 0? $ time_diff: $ time_diff + 24; 'Peut-être que cela va le réparer? –

Répondre

0

j'ai réussi à trouver une solution à cela, la classe DateInterval a gardé de jeter 21 pour moi aswell, bien que quand je l'objet que je en sortie pouvais voir l'heure comme 3.

Depuis DateTime fait la comparaison avec l'époque et ignore le fuseau horaire, j'ai dû créer un nouveau DateTime pour les deux fois et ensuite exécuter la comparaison.

//Let's say it is 11pm 23:00 in LA 
$local_tz = new DateTimeZone('America/Los_Angeles'); 
$local = new DateTime('now', $local_tz); 

//NY is 3 hours ahead, so it is 2am, 02:00 
$user_tz = new DateTimeZone('America/New_York'); 
$user = new DateTime('now', $user_tz); 

$usersTime = new DateTime($user->format('Y-m-d H:i:s')); 
$localsTime = new DateTime($local->format('Y-m-d H:i:s')); 

$interval = $usersTime->diff($localsTime); 
print_r($interval->h); //outputs 3  

Exécution des tests avec des rendements $user->modify("-4 hours"); $local->modify("-4 hours"); 3. (qui met un de ceux juste avant minuit la veille)