python - mexico - eliminar pytz timezone
timezone ids (1)
¿Hay alguna manera simple de eliminar la zona horaria de un objeto pytz datetime?
por ejemplo, reconstruir dt
desde dt_tz
en 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>)
Para eliminar una zona horaria (tzinfo) de un objeto datetime:
# dt_tz is a datetime.datetime object
dt = dt_tz.replace(tzinfo=None)
Si está utilizando una biblioteca como arrow , puede eliminar la 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, al usar 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 los objetos datetime.datetime
donde uno es consciente de la zona horaria y otro es la 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