2009-02-05 6 views
29

J'ai lu sur ce sujet depuis quelques heures, et je pense que j'ai une idée à ce sujet, mais j'aimerais avoir une confirmation.Meilleure façon de gérer le stockage/affichage des dates dans différents fuseaux horaires en PHP?

Situation

Je veux un utilisateur, par exemple, la Californie pour pouvoir poster un commentaire qui sera stocké dans MySQL. Je veux ensuite que le Texas, par exemple, puisse voir le commentaire avec la date de publication ajustée à son fuseau horaire.

Solution proposée

Stockage

  1. Exécutez la commande suivante au début de l'application afin que toutes les fonctions de date utilisent fuseau horaire UTC: date_default_timezone_set('UTC');
  2. $Date = new DateTime(); pour obtenir un objet DateTime avec la date et l'heure actuelles en UTC. Utilisez $Date->format() pour obtenir la valeur à insérer dans la colonne de type datetime dans MySQL.

Affichage

  1. Get JavaScript de l'information fuseau horaire de l'utilisateur et le stocker dans un cookie.
  2. Exécutez une requête MySQL SELECT pour récupérer la valeur de la colonne datetime.
  3. $Date = new DateTime($row['time']); pour instancier un objet DateTime avec l'heure UTC stockée.
  4. $Date->setTimezone(new DateTimeZone($userTimezone)); pour ajuster l'heure UTC au fuseau horaire de l'utilisateur.
  5. affichage à l'aide $Date->format();

Est-ce que l'essentiel de ce qu'il faut faire? Est-ce que je manque une meilleure solution? Merci de votre aide!

Répondre

14

Il peut être rendu encore plus simple. Puisque vous utilisez JavaScript, pourquoi ne pas utiliser JavaScript pour ajuster le fuseau horaire sur le client?

  1. magasin tout temps sur le serveur comme UTC
  2. les servir au client comme UTC
  3. client JavaScript utilise ajuster le temps de fuseau horaire

Non seulement cela rend les choses plus simples mais il surmonte également un problème avec votre modèle. Si j'ai enregistré mon compte à New York mais voyage en Australie, je veux voir les heures selon le fuseau horaire australien. En fait, l'utilisation de JavaScript que vous utilisez peut facilement ajuster les paramètres, rendant le design encore plus dynamique.Deuxièmement, vous pouvez éviter le temps de stockage du fuseau horaire de l'utilisateur. Cela dit, si vous voulez que votre design se dégrade vers des navigateurs non-JavaScript, il est préférable d'adopter une approche côté serveur reposant sur des cookies HTTP (plutôt que de s'appuyer sur JS pour récupérer des cookies).

+0

Je pense que je vais définir le cookie fuseau horaire sur la connexion de l'utilisateur, il devrait donc mettre à jour si vous voyagez en Australie et connectez-vous à partir de là. Suggérez-vous que du JavaScript soit lancé lors du chargement de la page qui recherche des temps, par exemple, et les convertisse tous à la volée? –

+0

La seule façon d'accéder à l'horloge utilisateur est via JS ou géo-ip. Ce dernier est complexe et peu fiable. Si vous utilisez JS dans tous les cas, le faire au moment de la connexion nécessite plus de maintenance (suivi côté serveur). Le faire à la volée a plus de sens ici. – aleemb

+0

Merci. Comme je le recherche plus, je commence à être d'accord avec vous. –

3

Vous le faites tous les droits. Stockez toutes les dates en UTC (GMT + 0), récupérez-les en tant que telles dans la base de données et appliquez le décalage de l'utilisateur. Essentiellement, vous avez tout couvert du début à la fin, il n'y a vraiment rien à ajouter, je ne pense pas que vous pouvez l'optimiser au-delà de ce que vous faites déjà.

+0

Je suis d'accord, c'est ce que je ferais. – Ross

Questions connexes