Comment obtenir UNIX_TIMESTAMP pour ne pas compenser un champ datetime lorsque dans des fuseaux horaires différents?

StackOverflow https://stackoverflow.com/questions/1511121

Question

Je l'ai construit un petit forum où les utilisateurs peuvent envoyer des messages. Mon serveur est aux Etats-Unis, mais le userbase pour le forum est à Taiwan (+ 15hrs).

Lorsque quelqu'un poste à la forme, je stocke le temps dans ma base de données mySQL dans le format AAAA-MM-JJ HH: MM: SS. Quand je regarde dans la base de données, le temps affiche l'heure correcte (le temps que la personne à Taiwan a affiché).

Cependant, quand j'utilise UNIX_TIMESTAMP pour obtenir la date de la base de données, le temps est modifié.

Exemple:

  1. je poste quelque chose sur le forum. Le datetime sur ma montre-bracelet est 02/10/2009 11:24 (Taiwan Time)
  2. Je regarde dans la base de données et il dit que le datetime est 2009-10-2 11h24 (en même temps que ma montre-bracelet. Bon!)
  3. Puis, quand j'utilise UNIX_TIMESTAMP pour afficher la date sur mon site, il montre que 2009-10-03 16:22 (mauvaise! Il a appliqué un décalage)

Est-il possible que je peux obtenir UNIX_TIMESTAMP pour arrêter la conversion du temps (en appliquant un décalage) lorsque je fais une recherche de la date de la base de données?

Extra Info: J'utilise PHP
J'ai mis le fuseau horaire dans mon PHP à Taiwan (date.timezone = Asie / Taipei)
Si un utilisateur est dans un autre fuseau horaire que Taiwan, je veux convertir le temps en temps Taipei. Le site est près de 100% Taiwan utilisé donc je veux juste le temps de Taiwan pour montrer tout le temps, même si elles sont dans un autre fuseau horaire.
Inclure la date dans beaucoup de régions du site dans une autre date () formats.
Fondamentalement, tout fonctionne très bien, sauf que lorsque j'utilise UNIX_TIMESTAMP pour interroger les données sur, il applique un décalage du temps.

Merci!

Était-ce utile?

La solution 4

J'ai trouvé une solution qui est juste récupérer la date à partir de la base de données sans le convertir en temps Unix, puis juste en utilisant strtotime (); pour le convertir en temps Unix. Fondamentalement, au lieu de convertir en utilisant SQL, je suis la conversion en utilisant php. Les seules choses que je n'aime pas à ce sujet sont: strtotime ()

Y at-il d'autres moyens?

Autres conseils

MySQL écrit dates « en l'état », les lit aussi ainsi, mais UNIX_TIMESTAMP traite toutes les dates d'entrée comme dans votre fuseau horaire local et les convertit en horodatages UTC / GMT signifie qu'il appliquera votre fuseau horaire local offset, maintenant, si vous traitez votre horodatages retour de mysql par exemple. date de php () il sera de nouveau appliquer votre fuseau horaire local décalage (noter qu'il ya aussi gmtime () qui ne le fait pas), qui produira des résultats indésirables.

Mais vous pouvez obtenir avec cette astuce suivante qui soustrayez votre fuseau horaire de session avant UNIX_TIMESTAMP () applique, de sorte que vous obtiendrez le nombre exact quel que soit le serveur / fuseau horaire local si vous voulez la même date exacte db comme si il était temps de GMT.

mysql> SELECT UNIX_TIMESTAMP(CONVERT_TZ("2013-05-27","GMT",@@session.time_zone));
+--------------------------------------------------------------------+
| UNIX_TIMESTAMP(CONVERT_TZ("2013-05-27","GMT",@@session.time_zone)) |
+--------------------------------------------------------------------+
|                                                         1369612800 |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

Une autre solution serait de définir les serveurs ou fuseau horaire de la session à 0 (GMT), donc il n'y aura pas de véritables conversions en cours.

Le meilleur que j'ai trouvé à ce problème est d'utiliser ceci:

SELECT UNIX_TIMESTAMP (CONVERT_TZ (<< >>, '+ 15:00', '+ 00:00')) + TIMESTAMPDIFF (seconde, utc_timestamp (), maintenant ())

Exemple: Je veux obtenir l'horodatage du 31 mai 2012 à 23:59:59, heure locale. SELECT UNIX_TIMESTAMP (CONVERT_TZ ( '2012-05-31 23:59:59', '+ 15:00', '+ 00:00')) + TIMESTAMPDIFF (seconde, utc_timestamp (), maintenant ())

De cette façon, je reçois l'horodatage GMT-0, ce qui correspond à la localtime.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top