2012-08-25 10 views
6

Ci sono un sacco di domande sulle conversioni datetime UTC e non sembra esserci un consenso su un "miglior modo".Come, con python, prendere un datetime UTC, rilevare automaticamente il fuso orario degli utenti e convertire il datetime nel formato desiderato?

In base a questo: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/, pytz è il modo migliore per andare. Egli mostra la conversione in fuso orario come questo datetime.datetime.utcnow().replace(tzinfo=pytz.utc) ma non dice come ottenere fuso orario dell'utente ...

Questo ragazzo https://stackoverflow.com/a/7465359/523051 dice "localize regola per l'ora legale, replace non"

Tutti quelli che vedono usando pytz viene fornito il proprio fuso orario (users_timezone = timezone("US/Pacific")), che non capisco perché non si può sapere se è lì che il tuo spettatore è ...

Questo ragazzo https://stackoverflow.com/a/4771733/523051 ha un modo per rilevare automaticamente i fusi orari, ma questo utilizza la libreria dateutil e non pytz, come raccomandato da Armin Ronacher e i documenti python ufficiali (http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior, appena sopra quell'ancora in scatola gialla)

Tutto ciò di cui ho bisogno è il modo più semplice, a prova di futuro, tutto l'ora legale/ecc. considerato come modo di prendere il mio timbro datetime.utcnow() 2012-08-25 10:59:56.511479), convertirlo nel fuso orario dell'utente. E mostrare come questo:

Aug 25 - 10:59AM 

e se l'anno non è l'anno in corso, mi piacerebbe dire

Aug 25 '11 - 10:59AM 

risposta

3

bene, qui è (anche, il mio primo contributo alla SO:))

essa richiede 2 librerie esterne che possono gettare un po 'fuori ...

from datetime import datetime 
from dateutil import tz 
import pytz 

def standard_date(dt): 
    """Takes a naive datetime stamp, tests if time ago is > than 1 year, 
     determines user's local timezone, outputs stamp formatted and at local time.""" 

    # determine difference between now and stamp 
    now = datetime.utcnow() 
    diff = now - dt 

    # show year in formatting if date is not this year 
    if (diff.days/365) >= 1: 
     fmt = "%b %d '%y @ %I:%M%p" 
    else: 
     fmt = '%b %d @ %I:%M%p' 

    # get users local timezone from the dateutils library 
    # http://stackoverflow.com/a/4771733/523051 
    users_tz = tz.tzlocal() 

    # give the naive stamp timezone info 
    utc_dt = dt.replace(tzinfo=pytz.utc) 
    # convert from utc to local time 
    loc_dt = utc_dt.astimezone(users_tz) 
    # apply formatting 
    f = loc_dt.strftime(fmt) 

    return f 
+0

ho imparato che il tzlocal() non funziona affatto su Heroku. la funzione sopra riportata restituisce semplicemente l'ora UTC. – chrickso

+0

Inoltre, ho perso ogni speranza che il loro sia un modo affidabile per determinare con precisione il fuso orario di un utente e regolare automaticamente i tempi. Vedo che Twitter ha un'impostazione per regolare il fuso orario, quindi questo deve essere il modo: memorizzare le preferenze dell'utente e utilizzarlo per le conversioni. – chrickso

Problemi correlati