Django avec réglage du fuseau horaire du système par rapport aux fuseaux horaires individuels de l'utilisateur
Comment Django traiter le cas des fuseaux horaires différents pour chaque utilisateur? Idéalement, je voudrais que le serveur dans le fuseau horaire UTC (par exemple, dans settings.py set TIME_ZONE="UTC") de sorte que tous datetimes ont été stockées dans la base de données que l'UTC. Des trucs comme cette me fait peur c'est pourquoi je préfère UTC partout.
Mais que ce sera difficile pour stocker un fuseau horaire pour chaque utilisateur, et continuer à utiliser les standards de django datetime mise en forme et modelform wrappers. Dois-je prévoir d'avoir à écrire la date de la manipulation de code partout pour convertir des dates dans le fuseau horaire de l'utilisateur et de retour à l'UTC de nouveau?
Je suis toujours en cours à travers le django tutoriel mais je sais combien de douleur il peut être de traiter avec des fuseaux horaires de l'utilisateur dans certains autres cadres qui assument système de fuseau horaire partout, donc j'ai pensé que je voudrais vous demander maintenant.
De mes recherches du moment consistait à consulter la documentation de django et de ne trouver que des une référence de fuseaux horaires.
Supplémentaires:
- Il y a un quelques bugs soumis concernant Django et le fuseau horaire de manutention.
- Babel a certains contrib code pour django qui semble traiter avec le fuseau horaire de mise en forme dans les paramètres régionaux.
source d'informationauteur Nick Sonneveld
Vous devez vous connecter pour publier un commentaire.
Mise à jour, janvier 2013: Django 1.4 a maintenant en charge des fuseaux horaires!!
Vieille réponse pour des raisons historiques:
Je vais travailler sur ce problème moi-même pour mon application. Ma première approche de ce problème serait d'aller avec django core developer Malcom Tredinnick conseils en ce django-l'utilisateur du poste. Vous aurez envie de stocker de l'utilisateur le fuseau horaire dans leur profil d'utilisateur, probablement.
Je voudrais également vous encourageons vivement à le regarder dans les pytz modulequi permet de travailler avec les fuseaux horaires moins douloureux. Pour le front-end, j'ai créé un "fuseau horaire sélecteur" basé sur la commune de fuseaux horaires dans pytz. J'ai une boîte de sélection de la région, et un autre pour l'emplacement (par exemple: US/Centrale est rendu avec deux boîtes). Il fait de la sélection des fuseaux horaires un peu plus pratique que de patauger dans une liste de plus de 400 choix.
Il n'est pas difficile d'écrire fuseau horaire conscient de code dans django:
J'ai écrit simple application django qui permet de gérer les fuseaux horaires problème dans django projets: https://github.com/paluh/django-tz. Il est basé sur Brosner (django-timezone) code mais prend une approche différente pour résoudre le problème - je pense qu'il met en œuvre quelque chose de similaire à la vôtre et FernandoEscher propositions.
Toutes les valeurs datetime sont stockées dans la base de données dans un fuseau horaire (selon TIME_ZONE réglage) et la conversion de la valeur appropriée (c'est à dire fuseau horaire de l'utilisateur) sont réalisées dans des modèles et des formulaires (il y a la forme de widget pour datetimes champs qui contient d'autres de ses avec le fuseau horaire). Chaque datetime conversion est explicite - pas de magie.
De plus, il n'est par thread de cache qui permet de simplifier ces datatime conversions (mise en œuvre est basée sur django i18n la machinerie de traduction).
Lorsque vous voulez vous souvenir de fuseau horaire, vous devez ajouter un champ timezone pour modèle de profil et écrire de simples middleware (suivre l'exemple de la doc).
Django ne gère pas du tout, en grande partie parce que Python n'est pas non plus. Python (Guido?) a décidé de ne pas soutenir les fuseaux horaires depuis bien une réalité du monde sont "plus politique que rationnel, et il n'y a pas de standard adapté à chaque application."
La meilleure solution pour la plupart est de ne pas s'inquiéter à ce sujet d'abord et de s'appuyer sur ce que Django fournit par défaut dans le settings.py fichier
TIME_ZONE = 'America/Los_Angeles'
à aider par la suite.Compte tenu de votre situation pytz est le chemin à parcourir (il a déjà été mentionné). Vous pouvez l'installer avec
easy_install
. Je recommande la conversion de fois sur le serveur à l'UTC à la volée lorsqu'elles sont demandées par le client, puis la conversion de ces temps UTC à l'utilisateur du fuseau horaire local sur le client (via Javascript dans le navigateur ou via le système d'exploitation iOS/Android).Le serveur de code pour convertir fois stockées dans la base de données avec le
America/Los_Angeles
fuseau horaire UTC ressemble à ceci:Si vous envoyez
x_utc
vers une page web, le Javascript peut convertir à l'utilisateur du système d'exploitation de fuseau horaire. Si vous envoyezx_utc
vers le bas pour un iPhone, iOS peut faire la même chose, etc. J'espère que ça aide.Pas un Django d'experts ici, mais autant que je sache, Django a pas de magie, et je ne peux même pas imaginer une telle magie qui serait à l'œuvre.
Par exemple: vous n'avez pas toujours un gain de temps en temps UTC. Dans une application de calendrier, par exemple, vous voulez enregistrer la date dans le, heure locale, que le calendrier de l'événement se produit. Qui peut être différente par les serveurs et les utilisateurs de fuseau horaire. Afin d'avoir un code qui convertit automatiquement tous sélectionnés datetime pour les serveurs de temps de la zone serait une Très Mauvaise Chose.
Donc, oui, vous avez à gérer vous-même. Je vous recommande d'enregistrer le fuseau horaire pour tout, et bien sûr exécuter le serveur en UTC, et que tous les datetimes générés par l'utilisation de l'application UTC, puis de les convertir pour les utilisateurs de fuseau horaire lors de l'affichage. Il n'est pas difficile, tout simplement ennuyeux à retenir. quand il s'agit de datetimes qui sont entrés par l'utilisateur, elle est dépendante de l'application si vous devez les convertir au format UTC ou non. Je voudrais à titre de recommandation générale convertit pas à l'UTC mais enregistrer dans le temps aux utilisateurs de la zone, avec les informations de fuseau horaire qui est.
Oui, les fuseaux horaires est un gros problème. J'ai écrit quelques posts sur le ennuyeux, comme ici: http://regebro.wordpress.com/2007/12/18/python-and-time-zones-fighting-the-beast/
À la fin vous aurez à prendre soin des problèmes de fuseau horaire vous-même, car il n'y a pas de véritable réponse correcte à la plupart des questions.
Vous pourriez commencer par prendre un coup d'oeil à la django-fuseaux horaires application. Il met à disposition un certain nombre de fuseau horaire basée sur le modèle des champs (et de leurs champs correspondants, et certains décorateurs), où l'on pouvait au moins magasin autre fuseau horaire de valeurs par l'utilisateur (si rien d'autre).
À la recherche à la django-fuseaux horaires application, j'ai trouvé qu'il ne supporte pas les SGBD MySQL, car MySQL ne pas stocker sur le fuseau horaire de référence au sein de datetimes.
Bien, je pense que j'ai réussi à contourner ce par bifurquer le Brosner bibliothèque et en le modifiant pour fonctionner de façon transparente à l'intérieur de vos modèles.
Là, je suis en train de faire la même chose que le django système de traduction, de sorte que vous pouvez obtenir de l'utilisateur unique fuseau horaire de conversion. Vous devriez y trouver un Champ de la classe et certains datetime utils pour avoir toujours datetimes converti à l'utilisateur de fuseau horaire. Donc, chaque fois que vous faites une demande et faire une requête, tout sera timezoned.
Essayez-le!