2008-09-22 6 views
38

¿Cómo puedo representar correctamente una zona horaria diferente en mi zona horaria? El siguiente ejemplo sólo funciona porque sé que EDT es de una hora por delante de mí, así que puede descomentar la sustracción de myTimeZone()¿Cómo uso las zonas horarias con un objeto datetime en python?

import datetime, re 
from datetime import tzinfo 

class myTimeZone(tzinfo): 
    """docstring for myTimeZone""" 
    def utfoffset(self, dt): 
     return timedelta(hours=1) 

def myDateHandler(aDateString): 
    """u'Sat, 6 Sep 2008 21:16:33 EDT'""" 
    _my_date_pattern = re.compile(r'\w+\,\s+(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\:(\d+)\:(\d+)') 
    day, month, year, hour, minute, second = _my_date_pattern.search(aDateString).groups() 
    month = [ 
      'JAN', 'FEB', 'MAR', 
      'APR', 'MAY', 'JUN', 
      'JUL', 'AUG', 'SEP', 
      'OCT', 'NOV', 'DEC' 
    ].index(month.upper()) + 1 
    dt = datetime.datetime(
     int(year), int(month), int(day), 
     int(hour), int(minute), int(second) 
    )     
    # dt = dt - datetime.timedelta(hours=1) 
    # dt = dt - dt.tzinfo.utfoffset(myTimeZone()) 
    return (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, 0, 0) 

def main(): 
    print myDateHandler("Sat, 6 Sep 2008 21:16:33 EDT") 

if __name__ == '__main__': 
    main() 
+0

Eche un vistazo a [esta respuesta] (http://stackoverflow.com/a/18646797/2697658). ¡Espero eso ayude! – juan

+0

su formato específico de fecha/hora se puede manejar usando el paquete stdlib 'email.utils': [' ts ​​= mktime_tz (parsedate_tz ('Sat, 6 Sep 2008 21:16:33 EDT')) '] (http: // stackoverflow .com/a/23117071/4279) – jfs

Respuesta

9

la biblioteca estándar de Python no contiene información de zona horaria, porque desafortunadamente los datos cambian zona horaria mucho más rápido que Python. Necesitas un módulo de terceros para esto; la opción habitual es pytz

+1

Eso no explica por qué la biblioteca estándar no puede manejar -500 sin embargo. –

+5

Esa no es una razón válida. La biblioteca estándar podría usar recursos en la plataforma en la que se ejecuta si está disponible y degradar con gracia si no se encuentra el historial de zona horaria. –

+0

@ Prof.Falken: ¿cómo se degradaría graciosamente si la información de la zona horaria no está disponible (elevar excepciones, devolver (posiblemente) resultados incorrectos, ambos)? Por cierto, ver [PEP 431: mejoras de soporte de zona horaria] (http://legacy.python.org/dev/peps/pep-0431/) – jfs

37

Recomiendo babel y pytz al trabajar con zonas horarias. Mantenga los objetos internos de fecha/hora ingenuos y en UTC y conviértelos a su zona horaria para formatear solamente. La razón por la que probablemente desee objetos ingenuos (objetos sin información de zona horaria) es que muchas bibliotecas y adaptadores de bases de datos no tienen idea de las zonas horarias.

+0

Gracias por recomendarnos a pytz. –

+0

Actualice el enlace de Babel a http://babel.pocoo.org/ (como dice el sitio web anterior) – saeedgnu

+0

También observe que babel está encima de pytz – saeedgnu

7

Para el actual zona horaria local, se puede utilizar:

>>> import time 
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone 
>>> offset/60/60 * -1 
-9 

El valor devuelto se encuentra segundos Oeste de UTC (con áreas del este de UTC obteniendo un valor negativo). Esto es lo opuesto a cómo nos gustaría, de ahí el * -1.

localtime().tm_isdst será cero si los ahorros de luz diurna no están vigentes actualmente (aunque esto puede no ser correcto si un área ha cambiado recientemente su ley de ahorro de luz natural).

+0

['time.timezone' y' time.altzone' no son suficientes en algunos casos] (http://stackoverflow.com/q/3168096/4279) – jfs

-2

Estamos familiarizados con la zona horaria cortada de GMT (ahora UTC), pero Python toma la zona horaria cortada de Western. Es por eso que hay un corte de zona horaria negativo en Python, creo.

Cuestiones relacionadas