Comment puis-je supprimer un fuseau horaire pytz d'un objet datetime?

122

Existe-t-il un moyen simple de supprimer le fuseau horaire d'un objet datetime pytz?
par exemple en reconstruisant à dtpartir dt_tzde cet exemple:

>>> 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
la source

Réponses:

209

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.datetimeobjet à insérer dans la base de données. La solution est de convertir votre datetime.datetimeobjet 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.datetimeobjets 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
user1094786
la source