Quelques problèmes avec les fuseaux horaires en PHP sont restés dans ma tête pendant un moment maintenant, et je me demandais s'il y avait de meilleures façons de les gérer que ce que je suis en train de faire.Traiter les fuseaux horaires en PHP
Toutes les questions tournent base de données autour reformatage dates stockées:
Lorsque vous traitez avec un site qui doit prendre en charge plusieurs fuseaux horaires (pour les utilisateurs), pour normaliser la offest de fuseau horaire de horodatages stockées je stocker toujours avec le serveur fuseau horaire en utilisant l'attribut CURRENT_TIMESTAMP
ou la fonction NOW()
.
De cette façon, je n'ai pas à considérer quel fuseau horaire a été défini pour PHP lorsque l'horodatage a été entré (puisque les fonctions d'heure PHP sont sensibles au fuseau horaire). Pour chaque utilisateur, selon sa préférence, je mets le fuseau horaire quelque part dans mon fichier d'amorçage en utilisant:
date_default_timezone_set($timezone);
Quand je suis à la recherche pour formater les dates avec le php fonction date()
, une certaine forme de conversion doit avoir lieu depuis MySQL stocke actuellement l'horodatage au format Y-m-d H:i:s
. Sans tenir compte de fuseau horaire, vous pouvez simplement lancer:
$date = date($format,strtotime($dbTimestamp));
Le problème est que date()
et strtotime()
sont les deux fuseaux horaires fonctions au courant, ce qui signifie que si le fuseau horaire PHP est défini différemment du fuseau horaire du serveur, le décalage horaire appliquera deux fois (au lieu d'une fois comme nous le voudrions). Pour traiter ceci, je récupère habituellement les horodatages MySQL en utilisant la fonction UNIX_TIMESTAMP()
qui n'est pas consciente du fuseau horaire, ce qui me permet d'appliquer date()
directement dessus - appliquant ainsi le décalage de fuseau horaire seulement une fois.
Je ne pas vraiment comme ça « hack » que je ne peux plus récupérer ces colonnes comme je le ferais normalement ou utiliser *
pour récupérer toutes les colonnes (parfois, il simplifie les requêtes beaucoup). En outre, il n'est parfois pas possible d'utiliser UNIX_TIMESTAMP()
(en particulier lorsque vous utilisez des paquets open-source sans beaucoup d'abstraction pour la composition des requêtes). Un autre problème est lors du stockage de l'horodatage, lorsque l'utilisation de CURRENT_TIMESTAMP
ou NOW()
n'est pas une option - stocker un horodatage généré par PHP le stockera avec le décalage de fuseau horaire que je voudrais éviter. Je manque probablement quelque chose de vraiment basique ici, mais jusqu'à présent, je n'ai pas été capable de trouver une solution générique pour gérer ces problèmes, donc je suis obligé de les traiter au cas par cas. Vos pensées sont les bienvenues
Pour quiconque trouve cette question et veut lire sur le sujet: http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Industrial