web-dev-qa-db-fra.com

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

Existe-t-il un moyen simple de supprimer le fuseau horaire d'un objet Pytz datetime?
par exemple. reconstruire dt à partir de dt_tz _ dans 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>)
94
Jonathan

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 telle que flèche , vous pouvez supprimer le fuseau horaire en convertissant simplement un objet flèche en objet datetime, puis en procédant de la même manière 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 supporte pas les fuseaux horaires avec son type DATETIME. Donc, utiliser ORM comme sqlalchemy enlèvera simplement le fuseau horaire lorsque vous lui donnerez un datetime.datetime objet à insérer dans la base de données. La solution consiste à convertir votre datetime.datetime object to UTC (donc tout dans votre base de données est UTC puisqu'il ne peut pas spécifier de fuseau horaire), puis insérez-le dans la base de données (où le fuseau horaire est supprimé de toute façon) ou supprimez-le vous-même. Notez également que vous ne pouvez pas comparer 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
166
user1094786