Question

(Python et Google App Engine sont nouveaux pour moi, veuillez me pardonner si mes questions me paraissent élémentaires).

Je passe beaucoup de temps à essayer de gérer plusieurs fuseaux horaires dans mon application Google App Engine.

Voici mes contraintes:

  1. Si un utilisateur entre l'heure d'une entrée, ce sera l'heure locale (y compris l'heure d'été, le cas échéant).
  2. Si un utilisateur n'entre pas l'heure, le système doit la saisir pour l'heure locale (y compris l'heure d'été, le cas échéant).
  3. Lorsque la date et l'heure sont affichées à l'utilisateur, elles doivent être à l'heure locale (y compris l'heure d'été, le cas échéant)

Je comprends que l'heure sera stockée en interne au format UTC avec un objet tzinfo et qu'App Engine enregistrera les modèles avec l'heure UTC.

Je pensais auparavant que tout cela était réglé en demandant à l'utilisateur de spécifier son fuseau horaire dans ses préférences. Ensuite, je voudrais simplement charger leurs préférences et ajouter ce tzinfo à n’importe quel objet datetime en référence à cet utilisateur.

Cependant, notre heure avancée récente l'a cassée. Il s’avère que je n’avais pas correctement implémenté dst () dans mes objets tzinfo. Si je comprends bien, je dois déterminer si DST est actuellement activé et, le cas échéant, renvoyer le décalage correct pour tzinfo.

Le problème est que je ne sais pas comment déterminer si l'heure d'été du fuseau horaire est actuelle ou non. Est-ce que je manque quelque chose d'évident?

Était-ce utile?

La solution

Si vous le pouvez, je vous conseillerais de consulter le package python-dateutil , qui contient des objets tz prédéfinis pour tous les fuseaux horaires, y compris les informations de décalage DST. Je ne pense pas qu'il y ait un moyen de "simplement savoir" si DST est activé ou non sans données complémentaires ... la date dépend de la plupart des fuseaux horaires (ou, du moins, des fuseaux horaires prenant en charge DST), et les dates varient en fonction des habitudes, de la politique et de nombreuses autres choses.

http://labix.org/python-dateutil

Autres conseils

Je vois des problèmes ici.

Si l'utilisateur saisit l'heure, il le saisit dans le fuseau horaire local, mais comment savoir de quelle heure il s'agit? Europe / Vilnius ou Europe / Madrid? Ou peut-être Australie / Melbourne? Si vous ne connaissez pas le fuseau horaire, la date / heure devient "naïve".

La seule base de données de fuseaux horaires considérée comme appropriée et précise (compte tenu de l'état du flux constant) est Olson timezone db, disponible pour Python sous la forme pytz . Il permet de convertir facilement les dates / heures entre les fuseaux horaires: vous devez d’abord prendre la date / heure et le fuseau horaire de l’utilisateur, localiser la date / heure dans le fuseau horaire de l’utilisateur, puis le prendre au format utc, prêt à être sauvegardé dans votre base de données. L’affichage est inversé: obtenez la date et l’heure de la base de données, localisez dans utc, puis affichez-les comme fuseau horaire de l’utilisateur.

Et la dernière chose: il n’existe pas de transformation DST automatique . En cas de dates / heures ambiguës, vous devez savoir à l'avance dans quel fuseau horaire l'heure est entrée. C'est notre réalité humaine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top