¿Cómo uso las zonas horarias con un objeto de fecha y hora en python?

¿Cómo represento correctamente una zona horaria diferente en mi zona horaria? El siguiente ejemplo solo funciona porque sé que la EDT está una hora por delante de mí, así que puedo descomentar la resta de myTimeZone ()

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() 

Recomiendo babel y pytz cuando se trabaja con zonas horarias. Mantenga sus objetos de fecha y hora internos ingenuos y en UTC y conviértalos a su zona horaria solo para el formato. La razón por la que probablemente desee objetos ingenuos (objetos sin información de zona horaria) es que muchas bibliotecas y adaptadores de base de datos no tienen idea de las zonas horarias.

  • Babel
  • pytz

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

Para la zona horaria local actual, puedes usar:

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

El valor devuelto está en segundos al oeste de UTC (las áreas al este de UTC obtienen un valor negativo). Esto es lo contrario a lo que realmente nos gustaría, de ahí el * -1 .

localtime().tm_isdst será cero si el horario de verano no está vigente actualmente (aunque esto puede no ser correcto si un área ha cambiado recientemente su ley de ahorro de luz diurna).

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