2012-08-25 36 views
6

hay un montón de preguntas acerca de las conversiones de fecha y hora UTC y allí no parece haber un consenso de una "mejor manera".Cómo, con pitón, tomar una fecha y hora UTC, los usuarios de autodetección zona horaria, y convertir la fecha y hora a formato deseado?

De acuerdo con esto: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/, pytz es el mejor camino a seguir. El autor muestra la conversión de zona horaria como esto datetime.datetime.utcnow().replace(tzinfo=pytz.utc) pero no dice cómo obtener la zona horaria del usuario ...

Este tipo https://stackoverflow.com/a/7465359/523051 dice "localize ajusta al horario de verano, replace no"

todos los que veo usando pytz está suministrando su propia zona horaria (users_timezone = timezone("US/Pacific")), que no entiendo porque no puede saber si es allí donde está su visor ...

Este tipo https://stackoverflow.com/a/4771733/523051 tiene una manera de detectar automáticamente las zonas horarias, pero esto es usar la biblioteca dateutil y no pytz, tal como se recomienda por tanto Armin Ronacher y los documentos oficiales de python (http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior, justo arriba del ancla en el cuadro amarillo)

Todo lo que necesito es el más simple, a prueba de futuro, todo el horario de verano/etc considerado forma de tomar mi sello datetime.utcnow() (2012-08-25 10:59:56.511479), conviértalo en la zona horaria del usuario. Y mostrar así:

Aug 25 - 10:59AM 

y si el año no es el año en curso, me gustaría decir

Aug 25 '11 - 10:59AM 

Respuesta

3

bien, aquí está (también, mi primera contribución a SO:))

sí requiere 2 bibliotecas externas que puedan arrojar alguna fuera ...

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

he aprendido que la tzlocal() no funciona en absoluto en heroku la función anterior simplemente devuelve la hora UTC. – chrickso

+0

también tenga en cuenta que he perdido toda esperanza de que sea una forma confiable de determinar con precisión la zona horaria de un usuario y ajustar los tiempos automáticamente. Veo que Twitter tiene una configuración para ajustar su zona horaria, por lo que esta debe ser la forma: almacenar las preferencias del usuario y usar eso para las conversiones. – chrickso

Cuestiones relacionadas