2010-12-10 60 views
1

Je rencontre un problème stupide que je ne peux pas comprendre. Comment se fait-ce morceau de code suivant:PHP - bizarre décalage de fuseau horaire

public function getFormattedOffsetFrom($refTimezoneId = 'Europe/Paris', $format = 'G\hi') { 
    $timestamp = time(); 
    $reference = new DateTime('@'.$timestamp); 
    $referenceTimeZone = new DateTimeZone($refTimezoneId); 
    $reference->setTimezone($referenceTimeZone); 
    $datetime = new DateTime('@'.$timestamp); 
    $datetime->setTimezone($this->timezone); 
    $offset = $this->timezone->getOffset($datetime) - $referenceTimeZone->getOffset($reference); 
    $prefix = '+'; 
    if($offset < 0) { 
     $prefix = '-'; 
     $offset = abs($offset); 
    } 
    return $prefix.date($format, $offset); 
} 

où $ this-> fuseau horaire est une instance de DateTimeZone positionné en Europe/Madrid, produit + 1h00 lorsqu'aucun args sont spécifiés ????

Paris et Madrid n'ont pas de décalage horaire. Je ne comprends pas.

Merci beaucoup pour votre aide !!!! Florent

+0

ahh, vous comparez Paris * contre * Madrid, désolé, je n'ai pas compris. Pouvez-vous produire les compensations brutes pour voir ce qui ne va pas? Il peut s'agir d'une erreur à l'intérieur de la fonction –

+0

, le décalage devrait être 0 :) – Rolf

+0

Je pense que vous devrez déboguer la fonction et voir où ça va mal ... –

Répondre

2

Pourquoi devrait être 0? L'Espagne et la France utilisent GMT + 1 comme fuseau horaire.

http://en.wikipedia.org/wiki/File:Time_zones_of_Europe.svg

Le problème est que vous essayez de formater $offset qui maintient la différence de temps en secondes, avec fonction date(), qui attend l'horodatage en tant que second paramètre. Si la fonction $offset == 0date le reconnaît comme 1970-01-01 00:00:00 GMT, alors dans votre fuseau horaire, il s'agira de 1970-01-01 01:00:00 GMT + 1, et vous utilisez le format pour retourner les heures et les minutes, c'est pourquoi vous avez +1 en sortie.

Vous devez formater manuellement cette différence de temps comme celui-ci:

$offsetH = floor($offset/3600); //full hours 
$offsetM = floor(($offset - $offsetH)/60); //full minutes 

return sprintf("%s%sh%02s",$prefix,$offsetH,$offsetM) ; 
+0

Il compare Paris * contre * Madrid, j'ai fait la même erreur au début –

+0

Merci, maintenant cela a du sens;) –

+0

hahaha, merci beaucoup pour votre aide, a du sens en effet :) – Rolf

1

Le problème peut être réduit à date('G', 0) donner « 1 ». La solution consiste à utiliser gmdate().