2012-06-08 16 views
65

¿Hay una forma simple de eliminar la zona horaria de un objeto pytz datetime?
p. reconstruir dt de dt_tz en este ejemplo:remove pytz timezone

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

Respuesta

115

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 arrow, a continuación, se puede quitar zona horaria simplemente convirtiendo un objeto de flecha en un objeto de fecha y hora, y 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, si utiliza ORM's como sqlalchemy, simplemente eliminará la zona horaria cuando le dé un objeto datetime.datetime para insertar en la base de datos. La solución es convertir su objeto datetime.datetime a UTC (para que todo en su base de datos sea UTC ya que no puede especificar la zona horaria) y luego insertarlo en la base de datos (donde la zona horaria se elimina de todos modos) o eliminarlo usted mismo. También tenga en cuenta que no puede comparar datetime.datetime objetos donde uno conoce la zona horaria y otro es zona horaria ingenua.

############################################################################## 
# 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