Comment puis-je convertir facilement des dates de l'heure UTC via PHP?
Je suis l'enregistrement des dates dans une base de données MySQL dans les champs datetime au format UTC. Je suis à l'aide de PHP, et j'ai appelé date_timezone_set('UTC'), de sorte que tous les appels à date() (sans date) retourne la date au format UTC.
Je puis donc d'un site web donné la possibilité de choisir sa fuseau horaire. Maintenant, je veux dates à afficher dans le site du fuseau horaire. Donc, si j'ai une date stockée comme "2009-04-01 15:36:13", il convient d'affichage pour un utilisateur du PDT du fuseau horaire (-7 heures) '2009-04-01 08:36:13'.
Ce qui est le plus facile (moins de code) méthode pour ce faire via PHP? Jusqu'à présent tout ce que j'ai pensé est
date('Y-m-d H:i:s', strtotime($Site->getUTCOffset() . ' hours', strtotime(date($utcDate))));
Est-il une façon plus simple?
Rien, si c'est la façon habituelle de faire. Je ne veux pas avoir à coller que des dizaines d'endroits tout au long de mon code si il y a quelque chose de plus simple.
Pas ce que vous avez demandé, mais juste au cas où: n'oubliez pas de régler la base de temps de la zone. Ou MySQL va convertir les dates en lui-même. Voir: dev.mysql.com/doc/refman/5.1/en/time-zone-support.html
phpphil, comment peut-elle le faire? Les champs DATETIME devrait être fuseau horaire agnostique. Vous dites que MySQL va utiliser le système de fuseau horaire, avec des fonctions comme MAINTENANT() et CURDATE()? J'ai ajouté --timezone=UTC à MySQL de mon.cnf.
le manuel dit: "La session en cours paramètre de fuseau horaire affecte l'affichage et le stockage des valeurs de temps qui sont à la zone sensible. Cela comprend les valeurs affichées par des fonctions telles que NOW() ou CURTIME(), et les valeurs stockées et récupérées à partir des colonnes TIMESTAMP. Les valeurs pour les colonnes de type TIMESTAMP sont converti à partir du fuseau horaire actuel à l'UTC pour le stockage, et de l'UTC à l'heure actuelle de la zone à des fins de récupération." avec l'entrée dans vous mon.cnf il devrait fonctionner correctement!
OriginalL'auteur Chad Johnson | 2009-06-04
Vous devez vous connecter pour publier un commentaire.
Voici ce que nous avons fait avec nos serveurs. On a mis tout à utiliser UTC, et on affiche dans le temps de l'utilisateur de la zone par la conversion de l'UTC à la volée. Le code en bas de ce post est un exemple de la façon d'obtenir que cela fonctionne, vous devez confirmer que cela fonctionne dans tous les cas avec votre installation (c'est à dire l'heure d'été, etc).
Configuration CentOS
/etc/sysconfig/clock
et définirZONE
àUTC
ln -sf /usr/share/zoneinfo/UTC /etc/localtime
La Configuration De MySQL
Importer des fuseaux horaires en MySQL si nécessaire:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Modifier mon.cnf et ajoutez la ligne suivante dans la section [mysqld]:
default-time-zone = 'UTC'
Code PHP
OriginalL'auteur PCheese
Pourquoi ne pas utiliser le construit en DateTime/TimeZone fonctionnalité?
Classe DateTime: http://us3.php.net/manual/en/class.datetime.php
DateTimeZone Classe: http://us3.php.net/manual/en/class.datetimezone.php
PHP fuseaux horaires supportés: http://php.net/manual/en/timezones.php
Droit, mais si il date_default_timezone_set() à l'UTC et il veut que la date de PDT ou etc. il aura à définir explicitement.
OriginalL'auteur Jordan S. Jones
Ce que vous êtes en train de faire est la bonne façon de faire les choses. Je vous recommande de coller avec le travail en seulement UTC et juste la conversion à la dernière minute pour l'affichage.
Voici une petite fonction que j'ai mis ensemble pour le temps de la zone de conversion à l'aide de la classe DateTime qui vient avec PHP. C'est un peu plus de code que vous avez, mais je pense que c'est plus facile et une meilleure façon de structurer les choses...
http://richardwillia.ms/blog/2011/04/time-zone-conversion-using-datetime-class/
Espère que ça aide.
Excellente solution seule chose que j'ai changé, c'était de passage dans le format que parfois je n'ai pas toujours envie d'un format spécifique en particulier lors de l'affichage à l'utilisateur final. +1 grande réponse
OriginalL'auteur Richard Williams
Avoir passé beaucoup de temps à s'occuper de cette question, ne pas tenter de mettre en œuvre la zone de traduction vous-même. C'est un royal PIA, heurte à des difficultés, et c'est très dur pour l'obtenir droit international.
Cela dit, la meilleure option est de convertir votre datetimes MySQL à timestamps, et il suffit d'utiliser la base de données à convertir temps:
timestamps dans MySQL sont plus petites, et le temps de soutien de la zone de traduction. datetime ne pas.
Avant d'afficher les informations du site sur la page, il suffit d'invoquer la commande ci-dessus, et il affiche correctement sans le code PHP des changements à tous.
Mises en garde:
Pour désactiver timestamp propriétés:
La par DÉFAUT 0 désactive la colonne qui est mis à jour lorsque vous mettez à jour les autres colonnes.
Eh bien, je voudrais être en désaccord. HORODATAGE peut être utilisé pour les informations de date/heure, aussi longtemps que vous ne courez pas dans les problèmes autour d'elle, plus précisément, qu'il est stocké au format UTC entier non signé dans la base de données, et il sera à court de dates en 2038 (ou alors...) Si vous avez besoin de stocker des dates avant 1970 ou après 2038, utiliser DATETIME et faire de la gymnastique nécessaire d'en charge les fuseaux horaires. Sinon, vous épargner l'effort et de l'utilisation des horodateurs et obtenir TZ traduction pour (presque) libre.
OriginalL'auteur razzed
Utilisation de l'échantillon:
OriginalL'auteur WwebMaster
OriginalL'auteur e2p
Cela a fonctionné pour moi et c'est assez propre
OriginalL'auteur saada
Convertir fuseau horaire de fuseau horaire du serveur et vice-versa, avec une seule fonction:
OriginalL'auteur Naresh Chennuri