2010-11-22 7 views
1

Mon serveur est aux États-Unis et je suis au Royaume-Uni.problème de fuseau horaire mysql

Je stocke des valeurs d'horodatage sur un serveur mysql en utilisant le paramètre CURRENT_TIMESTAMP par défaut. Ainsi, lorsque des entrées sont ajoutées à ma table, elles sont marquées avec l'heure actuelle. C'est l'heure du serveur (US), puis convertie en UTC par mysql.

Lorsque je récupère les valeurs, je veux les afficher dans le fuseau horaire actuel (UK). Donc, dans mon PHP utiliser la fonction suivante pour définir le fuseau horaire actuel:

mysql_query("SET time_zone = timezone;"); 

Cela semble fonctionner comme quand je demande mysql faire écho timezones serveur et session, je reçois SYSTEM et -08: 00 respectivement. Cependant, lorsque j'imprimerai plus tard mes valeurs d'horodatage dans le même script PHP, elles sont sorties en temps US.

Obtenir des résultats en PHP:

$result = mysql_query("SELECT ID,DateTime,Name,Comment,Location,Rating FROM table1 WHERE Latitude<$latup AND Latitude>$latdown AND Longitude<$lngup AND Longitude>$lngdown ORDER BY DateTime DESC") 

while(($row = mysql_fetch_array($ratingresult)) && ($i++ < 1)) { 
    echo "<tr><td>"; 
    echo $row['DateTime']; 
    echo "</td><td>"; 
    echo $row['Name']; 
    echo "</td><td>"; 
    echo $row['Comment']; 
    echo "</td><td>"; 
    echo $row['Location']; 
    echo "</td><td>"; 
    echo $row['Rating']; 
    echo "</td><td>"; 
    rate($row, $lat, $lng); 
    echo "</td></tr>"; 
} 

Toute aide serait vraiment apprécié!

+1

S'il vous plaît montrer un peu de code, en particulier lorsque vous imprimez les valeurs d'horodatage en PHP –

+0

Et la 'requête SET time_zone' est faite au cours de la même demande que la requête qui récupère l'horodatage? –

+0

Je ne pense pas ...Je l'ai maintenant changé pour: – Sam

Répondre

0

Travailler avec plusieurs fuseaux horaires dans MySQL peut être difficile.

Vous devez faire très attention en changeant le fuseau horaire par session comme cela. En plus de changer le résultat affiché que vous récupérez d'un champ TIMESTAMP (effectivement le nombre entier de secondes depuis 01-01-1970 00:00:00 GMT), il va également modifier les données insérées dans DATETIME champs (effectivement une chaîne codée en dur), et/ou comment NOW() est évalué.

Si ce n'est pas trop tard, et votre application permettrait, je vous recommande de configurer le serveur/fuseau horaire global au Royaume-Uni (et faire le changement respectif dans le my.cnf aussi):

par exemple mysql> SET GLOBAL time_zone = timezone; de http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

Ou encore, tout simplement convertir à/utiliser DATETIME s dans tous les domaines - en vous assurant quand vous faites la conversion de votre session le fuseau horaire où est

0

J'ai résolu le problème en utilisant PHP. .

$dt_obj = new DateTime($row['DateTime'], new DateTimeZone('America/Chicago')); 
$dt_obj->setTimezone(new DateTimeZone('Europe/London')); 
echo $dt_obj->format('d-m-Y H:i:s'); 

Cela fonctionne parce que mon serveur aux États-Unis est sur CST = fuseau horaire de Chicago. J'ai également supprimé toutes mes tentatives de modification du fuseau horaire mysql. Je suis sûr que changer le fuseau horaire du serveur est une solution pour certaines personnes mais je suis sur un serveur partagé donc je n'ai pas les permissions.

Ma question est maintenant - Y at-il un moyen de faire fonctionner mon site Web à l'échelle mondiale? c'est-à-dire en détectant l'exécution des utilisateurs? Je suppose que cela aurait besoin de JavaScript.

0

S'il vous plaît commenter ce code à exécuter pour un bon résultat:

date_default_timezone_set('Europe/London'); 
mysql_query("SET time_zone = '".date('P')."';"); 
+0

Pourquoi ce code fonctionne-t-il? Est-ce que vous réalisez que c'est une question vieille de 6 ans? – Martin