Le stockage datetime que l'UTC en PHP/MySQL
J'ai lu partout sur la conversion du temps à l'utilisateur d'un fuseau horaire dit que la meilleure méthode est de stocker une date et l'heure UTC puis il suffit d'ajouter l'utilisateur du décalage horaire pour le moment.
Comment puis-je stocker une date au format UTC heure? J'utilise MySQL champ DATETIME.
Lors de l'ajout d'un nouvel enregistrement à MySQL dans mon code PHP, je voudrais utiliser now()
à insérer dans MySQL DATETIME.
J'ai besoin d'utiliser quelque chose de différent que now()
pour stocker l'heure UTC?
- Si vous aller dans cette voie, n'oubliez pas de compte pour l'heure d'été -- c'est à dire le décalage horaire n'est pas nécessairement constante pour un utilisateur donné de l'emplacement.
- Oui, j'ai lu beaucoup de confusion et de conflit choses au sujet de faire des fuseaux horaires en PHP, il semble être l'un des les choses php doit améliorer
- Pour ceux qui sont à la recherche pour plus d'info, j'ai un lien pour ces fabuleux articles: infiniteundo.com/post/25326999628/... et infiniteundo.com/post/25509354022/...
Vous devez vous connecter pour publier un commentaire.
MySQL:
UTC_TIMESTAMP()
PHP:
gmdate()
Aussi PHP
date_default_timezone_set()
est utilisé en PHP pour définir le fuseau horaire actuel pour le script. Vous pouvez le configurer pour le client fuseau horaire de sorte que toutes les fonctions de mise en forme de retour le temps au temps.Dans la vérité si j'ai eu du mal à faire ce travail et de toujours tomber dans quelque piège. Par exemple. l'information en temps retourné à partir de MySQL n'est pas formaté comme 'UTC' donc la fonction strtotime transforme en une heure locale si vous n'êtes pas prudent. Je suis curieux d'entendre si quelqu'un a une fiable solution pour ce problème, qui ne se casse pas quand les dates de parcourir les médias limites (HTTP->PHP->MySQL et MySQL->PHP->HTTP), compte tenu également de XML et RSS/Atom.
gmdate()
, cela renvoie une chaîne de caractères. Ne serait-ce pas en conflit avec le réglage du type de champ MySQL àDATETIME
?Je suggère d'insérer la date dans le fuseau horaire UTC. Cela va vous faire économiser beaucoup de maux de tête à l'avenir avec l'heure d'été à problèmes.
Quand j'ai une requête mes données que j'ai utiliser le script PHP suivant:
Vous pouvez remplacer le
DateTimeZone
de la valeur avec le PHP fuseaux horaires.." \U\T\C"
pour éviter toutes collisions avec le courant du futur format des caractères.DateTime
constructeur accepte une 2ème arg pour le fuseau horaire. par exemple,$date = new DateTime('2000-01-01', new DateTimeZone('UTC'));
Vous pouvez garder une copie statique du fuseau horaire UTC objet quelque part afin que vous n'avez pas à garder re-construction.NOW()
vous donne le temps (y compris le décalage horaire) du système de l'exécution de votre base de données. Pour obtenir de l'UTC date/heure vous devez utiliserUTC_TIMESTAMP()
comme décrit dans la Manuel De Référence De MySQL.https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp
Citer tous la réponse de lien ci-dessus en cas de suppression:
Pour aller avec @ypercube le commentaire de
CURRENT_TIMESTAMP
est stocké comme UTC mais récupéré dans le fuseau horaire actuel, vous pouvez affecter votre fuseau horaire du serveur avec le paramètre d' --default_time_zone option pour la récupération. Cela permet à votre récupération d'être toujours à l'heure UTC.Par défaut, l'option est "SYSTÈME" qui est la façon dont votre système de fuseau horaire est définie (ce qui peut ou peut ne pas être UTC!):
Vous pouvez régler ce, de façon dynamique:
Ou en permanence dans votre mon.cnf:
Redémarrer votre serveur, et vous verrez le changement:
Comme @Haluk l'indique, vous pouvez stocker la date UTC
datetime
.Je suis de compléter sa réponse dans les situations où la date à laquelle vous souhaitez insérer vient de code PHP, et en ajoutant quelques détails sur la façon dont il fonctionne :
Fait
datetime
en PHP ne dispose pas d'un fuseau horaire qui lui est associé. Ce qui est passé à PDO est juste une chaîne de caractères, dans l'un des formats reconnus par MySQL, représentant la date dans le fuseau horaire UTC. Par exemple, si la date est2015-10-21 19:32:33 UTC+2:00
, le code ci-dessus juste dit à MySQL pour insérer2015-10-21 17:32:33
.gmtdate("Y-m-d H:i:s")
vous donne la date du jour dans un tel format. En tout cas, tout ce que vous devez faire est de construire la chaîne de caractères représentant la date à laquelle vous souhaitez insérer dans l'heure UTC.Puis, quand vous lisez de la date, vous avez à dire à PHP que le fuseau horaire de la date que vous venez de récupérer et de l'UTC. Utiliser le code dans Haluk la réponse à cette question.
Aléatoire:
UTC_TIMESTAMP(6)
de temps avec 6 chiffres de microsecondes.MySQL 5.7+