¿Cómo puedo eliminar una zona horaria de pytz de un objeto de fecha y hora?

121

¿Existe una forma sencilla de eliminar la zona horaria de un objeto de fecha y hora de pytz?
por ejemplo, la reconstrucción dtde dt_tzen este ejemplo:

>>> import datetime
>>> import pytz
>>> dt = datetime.datetime.now()
>>> dt
datetime.datetime(2012, 6, 8, 9, 27, 32, 601000)
>>> dt_tz = pytz.utc.localize(dt)
>>> dt_tz
datetime.datetime(2012, 6, 8, 9, 27, 32, 601000, tzinfo=<UTC>)
Jonathan
fuente

Respuestas:

208

Para eliminar una zona horaria (tzinfo) de un objeto de fecha y hora:

# dt_tz is a datetime.datetime object
dt = dt_tz.replace(tzinfo=None)

Si está utilizando una biblioteca como una flecha , puede eliminar la zona horaria simplemente convirtiendo un objeto de flecha en un objeto de fecha y hora, luego haciendo lo mismo que en el ejemplo anterior.

# <Arrow [2014-10-09T10:56:09.347444-07:00]>
arrowObj = arrow.get('2014-10-09T10:56:09.347444-07:00')

# datetime.datetime(2014, 10, 9, 10, 56, 9, 347444, tzinfo=tzoffset(None, -25200))
tmpDatetime = arrowObj.datetime

# datetime.datetime(2014, 10, 9, 10, 56, 9, 347444)
tmpDatetime = tmpDatetime.replace(tzinfo=None)

¿Por qué harías esto? Un ejemplo es que mysql no admite zonas horarias con su tipo DATETIME. Entonces, usar ORM como sqlalchemy simplemente eliminará la zona horaria cuando le dé un datetime.datetimeobjeto para insertar en la base de datos. La solución es convertir su datetime.datetimeobjeto a UTC (por lo que todo en su base de datos es UTC, ya que no puede especificar la zona horaria), luego insértelo en la base de datos (donde la zona horaria se elimina de todos modos) o elimínelo usted mismo. También tenga en cuenta que no puede comparar datetime.datetimeobjetos donde uno es consciente de la zona horaria y otro es ingenuo de la zona horaria.

##############################################################################
# MySQL example! where MySQL doesn't support timezones with its DATETIME type!
##############################################################################

arrowObj = arrow.get('2014-10-09T10:56:09.347444-07:00')

arrowDt = arrowObj.to("utc").datetime

# inserts datetime.datetime(2014, 10, 9, 17, 56, 9, 347444, tzinfo=tzutc())
insertIntoMysqlDatabase(arrowDt)

# returns datetime.datetime(2014, 10, 9, 17, 56, 9, 347444)
dbDatetimeNoTz = getFromMysqlDatabase()

# cannot compare timzeone aware and timezone naive
dbDatetimeNoTz == arrowDt # False, or TypeError on python versions before 3.3

# compare datetimes that are both aware or both naive work however
dbDatetimeNoTz == arrowDt.replace(tzinfo=None) # True
usuario1094786
fuente