Re: Bug affichage dates de qualif
Date: dimanche 3 novembre 2013 08:55:18
Hello,
La fonction qui pose problème chez certains hébergeurs (dot OVH) est la fonction CONVERT_TZ appelée dans le fichier classes/GenericDBAccess.php avec 2 occurrences aux lignes 1171 et 1190.
Le meilleur moyen de vérifier que l'origine de votre problème est bien celui-ci consiste à lancer la requête suivante dans PHPMyadmin :
SELECT CONVERT_TZ('2013-05-15 12:00:00','Europe/Paris','America/New_York')
Si le résultat est "NULL" alors vous avez localisé le soucis. C'est parce que l'hébergeur de la base n'a pas de table de correspondance entre le nom des zones et la valeur à affecter (En forçant la conversion précédente avec la requête SELECT CONVERT_TZ('2013-05-15 12:00:00','+00:00','-06:00') vous devriez avoir comme résultat 2013-05-15 06:00:00...)
Voici donc comment le problème a été contourné chez nous (ATTENTION : le greffon que nous avons fait n'est valable que pour la conversion UTC vers une seule zone. Mais il permet quand même d'afficher enfin l'heure sur les pages !)
1ère possibilité : afficher les heures en UTC. On convertit donc à la hussarde depuis +00:00 vers +00:00
Il faut remplacer l'instruction :
$query .= ', CONVERT_TZ('.$this->tableName.'.'.$field.', \''.$this->fromTimezone.'\', \''.$this->toTimezone.'\') AS converted_'. $field;
par :
$query .= ", CONVERT_TZ(".$this->tableName.".".$field.", '+00:00', '+00:00') AS converted_". $field;
et l'instruction :
$query .= ', CONVERT_TZ('.$foreignTableName.'.'.$joinElement.', \''.$this->fromTimezone.'\', \''.$this->toTimezone.'\') AS '.$foreignTableName.'_converted_'.$joinElement;
par :
$query .= ", CONVERT_TZ(".$foreignTableName.".".$joinElement.", '+00:00', '+00:00') AS ".$foreignTableName."_converted_".$joinElement;
Evidemment, si vous voulez un affichage vers un autre fuseau (la Réunion par exemple), il suffit de remplacer '+00:00', '+00:00' par '+00:00', '+04:00'
2e possibilité : créer une table dans la base de données qui contient les intervalles de date correspondant aux heures d'hiver et d'été pour le siècle à venir (ça devrait suffire !!), et faire une requête qui va récupérer la valeur de l'incrément à ajouter à l'heure UTC.
Appelons cette table T_UTC_CONVERSION, elle contient 4 champs (Index, UTCC_DATE1, UTCC_DATE2, UTCC_VALEUR correspondant respectivement à l'index, les dates de l'intervalle et la valeur de l'incrément horaire dans cet intervalle).
L'instruction :
$query .= ', CONVERT_TZ('.$this->tableName.'.'.$field.', \''.$this->fromTimezone.'\', \''.$this->toTimezone.'\') AS converted_'. $field;
est remplacée par les 2 instructions :
$aDate = $this->tableName.".".$field;
$query .= ", DATE_ADD(".$aDate.", INTERVAL (SELECT(UTCC_VALEUR) FROM T_UTC_CONVERSION WHERE ((".$aDate." >= UTCC_DATE1) AND (".$aDate." < UTCC_DATE2))) HOUR) AS converted_". $field;
et l'instruction :
$query .= ', CONVERT_TZ('.$foreignTableName.'.'.$joinElement.', \''.$this->fromTimezone.'\', \''.$this->toTimezone.'\') AS '.$foreignTableName.'_converted_'.$joinElement;
est remplacée par les 2 instructions :
$aDate = $foreignTableName.".".$joinElement;
$query .= ", DATE_ADD(".$aDate.", INTERVAL (SELECT(UTCC_VALEUR) FROM T_UTC_CONVERSION WHERE ((".$aDate." >= UTCC_DATE1) AND (".$aDate." < UTCC_DATE2))) HOUR) AS ".$foreignTableName."_converted_".$joinElement;
Et ça marche nickel !!
La première solution est plus simple à mettre en oeuvre, mais ne permet qu'un offset figé. La seconde est un peu plus lourde mais permet la prise en compte des heures d'hiver et d'été.
Je peux vous envoyer la table par mail si vous le souhaitez (je ne crois pas possible de joindre un fichier dans ce message)
En espérant que cette manip vous aidera à résoudre cet épineux problème d'affichage...
Pop