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.datetime
objeto para insertar en la base de datos. La solución es convertir su datetime.datetime
objeto 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.datetime
objetos 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