2010-11-06 7 views
5

J'utilise python sur Django et Google App Engine. J'utilise également DateTimeProperty dans l'un de mes modèles. De temps en temps je voudrais montrer cette date et l'heure à l'utilisateur. Quel est le meilleur pour convertir la date-heure stockée dans DateTimeProperty en datetime de l'utilisateur?Conversion de l'heure UTC en date et heure locale de l'utilisateur

Ou une façon plus précise de cadrer la question: Quelle est la meilleure façon d'obtenir le fuseau horaire d'un client et de convertir un objet datetime python dans leur propre heure locale?

+0

double possible : http://stackoverflow.com/questions/4065157/django-time-issues/4065236#4065236 – mouad

+0

juste compris ce que l'acceptation est ... merci – speedplane

Répondre

8

Il s'agit plus d'une question Python, que d'une question GAE, à moins que GAE ait une infrastructure pour faciliter cela (j'ai fait un scan rapide mais je n'ai trouvé aucune référence). Fondamentalement, vous voulez stocker la date/heure dans le fuseau horaire UTC (par exemple utiliser datetime.datetime.utcnow) avec les fuseaux horaires de l'utilisateur, que vous pouvez soit essayer d'extraire des adresses IP utilisateur (en utilisant GeoDjango, si disponible sur GAE, ou pygeoip, vous avez besoin d'un db de géolocalisation comme: http://www.maxmind.com/app/geolitecity), ou de demander explicitement aux utilisateurs à ce sujet - ce qui a l'avantage que vous pouvez demander un nom de fuseau horaire descriptif, comme "Europe/Varsovie". Si vous demandez seulement UTC + 2, vous perdez toute indication de décalage DST.

Ensuite, vous pouvez passer de utc au fuseau horaire souhaité en utilisant par ex. pytz:

import pytz 
local_tz = pytz.timezone(timezone_name) 
return timestamp_utc.replace(tzinfo=pytz.utc).astimezone(local_tz).replace(tzinfo=None) 

- où timestamp_utc est datetime que vous voulez utc convertir, et timezone_name est le dit "Europe/Varsovie".

(Notez que je ne sais pas lequel de ces œuvres dans GAE, mais au moins vous saurez ce qu'il faut chercher)

+0

C'est plus compliqué que je ne le pensais. Demander explicitement aux utilisateurs est hors de question. GeoDjango ressemble à une énorme bibliothèque pour toutes sortes de choses liées à GEO, je veux juste convertir les adresses IP en fuseaux horaires. Même pytz semble vraiment grand. – speedplane

3

J'ai donc fait un peu plus de recherches sur ce sujet. Pour faire correctement les fuseaux horaires, vous devez suivre quelque chose comme Tomasz décrit dans sa réponse. Cependant, si vous êtes prêt à tolérer un peu de kludge, vous pouvez obtenir 90% du chemin avec beaucoup moins d'effort.

Lorsque l'utilisateur se connecte à ou ne toute action sur votre site, vous pouvez utiliser javascript pour obtenir leur fuseau horaire actuel offset et puis l'envoyer dans votre prochaine demande:

var offset = (new Date()).getTimezoneOffset() 
$.post("post.html", "offset="offset.toString(), ...); 

Bien sûr, cela suppose que l'utilisateur a correctement défini son fuseau horaire actuel. Ceci est discuté sur un certain nombre d'autres sites:

+0

Ah, très bien, je ne le savais pas. Pourtant, si vous développez par ex. un CRM, alors vous ne pouvez pas négliger les subtilités comme DST. –

Questions connexes