Pour supprimer un fuseau horaire (tzinfo) d'un objet datetime:
# dt_tz is a datetime.datetime object
dt = dt_tz.replace(tzinfo=None)
Si vous utilisez une bibliothèque comme une flèche , vous pouvez supprimer le fuseau horaire en convertissant simplement un objet flèche en objet datetime, puis en faisant la même chose que dans l'exemple ci-dessus.
# <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)
Pourquoi voudriez-vous faire cela? Un exemple est que mysql ne prend pas en charge les fuseaux horaires avec son type DATETIME. Ainsi, l'utilisation d'ORM comme sqlalchemy supprimera simplement le fuseau horaire lorsque vous lui donnerez un datetime.datetime
objet à insérer dans la base de données. La solution est de convertir votre datetime.datetime
objet en UTC (donc tout dans votre base de données est UTC car il ne peut pas spécifier de fuseau horaire) puis de l'insérer dans la base de données (où le fuseau horaire est supprimé de toute façon) ou de le supprimer vous-même. Notez également que vous ne pouvez pas comparer des datetime.datetime
objets dont l'un est conscient du fuseau horaire et l'autre est naïf.
##############################################################################
# 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