Comment obtenir UNIX_TIMESTAMP pour ne pas compenser un champ datetime lorsque dans des fuseaux horaires différents?
-
19-09-2019 - |
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:
- je poste quelque chose sur le forum. Le datetime sur ma montre-bracelet est 02/10/2009 11:24 (Taiwan Time)
- 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!)
- 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!
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.
MySQL prend le paramètre de fuseau horaire par défaut du système, sauf avis contraire, il explique les problèmes que vous rencontrez; jetez un oeil à la référence fuseau horaire manuel pour plus de détails. Sur la base de mon expérience, je suis venu à une conclusion UTC est le meilleur choix pour le stockage de date et l'heure; lors de l'affichage à l'utilisateur, ils sont convertis au fuseau horaire de l'utilisateur.
Si possible, modifiez toutes les entrées de date et d'heure dans la base de données à UTC, configurer fuseau horaire dans PHP usingdate_default_timezone_set()
and assurez-vous de le convertir correctement lors du rendu à l'utilisateur et lors de l'enregistrement dans la base de données ainsi. Si le stockage des valeurs UTC est pas une option, vous pouvez simplement les convertir en suivant Guide de référence de fuseau horaire de la même manière que UTC.
Ce que vous devez faire est de saisir la date et l'heure brute de la base de données, puis utiliser PHP DateTime pour le convertir. Jetez un oeil à DateTimeZone ainsi.
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.