2010-11-06 19 views
5

Sto usando python su Django e Google App Engine. Sto anche usando DateTimeProperty in uno dei miei modelli. Occasionalmente mi piacerebbe mostrare la data e l'ora all'utente.Conversione di data/ora UTC in data e ora locali dell'utente

Qual è la soluzione migliore per convertire il datetime archiviato in DateTimeProperty nel datetime dell'utente?

O un modo più preciso di inquadrare la domanda: qual è il modo migliore per ottenere il fuso orario di un cliente e convertire un oggetto datetime python nel proprio orario locale?

+0

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

+0

appena capito che cosa accetta è ... grazie – speedplane

risposta

8

Questa è più una domanda Python, che una GAE, a meno che GAE abbia qualche infrastruttura per facilitare questo (ho fatto una scansione veloce ma non ho trovato alcun riferimento).

In sostanza, si vuole memorizzare la data/volte nel fuso orario UTC (ad es datetime.datetime.utcnow uso), insieme con i fusi orari di utente, che è possibile provare a estrarre da indirizzi IP degli utenti (utilizzando GeoDjango, qualora sia presente sul GAE, o pygeoip; hai bisogno di qualche tipo di geolocalizzazione db come: http://www.maxmind.com/app/geolitecity) o di chiedere esplicitamente agli utenti su di esso - il che ha il vantaggio che puoi chiedere un nome descrittivo del fuso orario, come "Europa/Varsavia". Se chiedi solo UTC + 2, perdi qualsiasi indicazione di spostamento dell'ora legale.

Quindi, è possibile passare da utc al fuso orario desiderato utilizzando per es. pytz:

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

- dove timestamp_utc è datetime UTC che si desidera convertire, e nome_fuso_orario è il citato "Europa/Varsavia".

(Si noti che non so quale di queste opere in GAE, ma almeno si sa che cosa cercare)

+0

Questo è più complicato di quanto pensassi. Chiedere esplicitamente agli utenti è fuori questione. GeoDjango sembra un'enorme libreria per tutti i tipi di materiale relativo a GEO, voglio solo convertire gli indirizzi IP in fusi orari. Anche pytz sembra davvero grande. – speedplane

3

così ho fatto un po 'di più la ricerca in questo. Per fare correttamente i fusi orari, devi seguire qualcosa di simile a ciò che Tomasz ha descritto nella sua risposta. Tuttavia, se sei disposto a tollerare un po 'di kludge, puoi ottenere il 90% del tempo con molto meno sforzo.

Quando l'utente accede o che qualsiasi azione sul tuo sito, è possibile utilizzare javascript per ottenere compensare il loro fuso orario corrente e poi inviarlo nella successiva richiesta:

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

Naturalmente questo presuppone che l'utente ha impostato correttamente il loro fuso orario corrente. Questo è discusso su un certo numero di altri siti web:

+0

Ah, molto carino, non lo sapevo. Tuttavia, se sviluppi per es. un CRM, quindi non puoi trascurare sottigliezze come l'ora legale. –

Problemi correlati