¿Cómo configurar el desplazamiento UTC para datetime?

Mi servidor web basado en Python necesita realizar alguna manipulación de fecha utilizando la zona horaria del cliente, representada por su desplazamiento UTC. ¿Cómo construyo un objeto de fecha y hora con el desplazamiento UTC especificado como zona horaria?

Utilizando dateutil :

 >>> import datetime >>> import dateutil.tz >>> datetime.datetime(2013, 9, 11, 0, 17, tzinfo=dateutil.tz.tzoffset(None, 9*60*60)) datetime.datetime(2013, 9, 11, 0, 17, tzinfo=tzoffset(None, 32400)) >>> datetime.datetime(2013, 9, 11, 0, 17, tzinfo=dateutil.tz.tzoffset('KST', 9*60*60)) datetime.datetime(2013, 9, 11, 0, 17, tzinfo=tzoffset('KST', 32400)) 

 >>> dateutil.parser.parse('2013/09/11 00:17 +0900') datetime.datetime(2013, 9, 11, 0, 17, tzinfo=tzoffset(None, 32400)) 

Como un aparte, Python 3 (desde v3.2) ahora tiene una clase de zona horaria que hace esto:

 from datetime import datetime, timezone, timedelta # offset is in seconds utc_offset = lambda offset: timezone(timedelta(seconds=offset)) datetime(*args, tzinfo=utc_offset(x)) 

Sin embargo, tenga en cuenta que “los objetos de esta clase no se pueden usar para representar información de la zona horaria en los lugares donde se usan diferentes compensaciones en diferentes días del año o donde se han hecho cambios históricos a la hora civil”. Esto es generalmente cierto para cualquier conversión de zona horaria que se basa estrictamente en el desplazamiento UTC.

La documentación del módulo datetime contiene una clase tzinfo ejemplo que representa un desplazamiento fijo.

 ZERO = timedelta(0) # A class building tzinfo objects for fixed-offset time zones. # Note that FixedOffset(0, "UTC") is a different way to build a # UTC tzinfo object. class FixedOffset(tzinfo): """Fixed offset in minutes east from UTC.""" def __init__(self, offset, name): self.__offset = timedelta(minutes = offset) self.__name = name def utcoffset(self, dt): return self.__offset def tzname(self, dt): return self.__name def dst(self, dt): return ZERO 

Como Python 3.2 ya no es necesario proporcionar este código, ya que datetime.timezone y datetime.timezone.utc se incluyen en el módulo datetime y deben usarse en su lugar.