Wie kann ich eine Pytz-Zeitzone aus einem Datetime-Objekt entfernen?

120

Gibt es eine einfache Möglichkeit, die Zeitzone aus einem Pytz-Datetime-Objekt zu entfernen?
zB Rekonstruktion dtaus dt_tzin diesem Beispiel:

>>> 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
quelle

Antworten:

207

So entfernen Sie eine Zeitzone (tzinfo) aus einem datetime-Objekt:

# dt_tz is a datetime.datetime object
dt = dt_tz.replace(tzinfo=None)

Wenn Sie eine Bibliothek wie Pfeil verwenden , können Sie die Zeitzone entfernen, indem Sie einfach ein Pfeilobjekt in ein Datum / Uhrzeit-Objekt konvertieren und dann dasselbe wie im obigen Beispiel tun.

# <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)

Wieso würdest du das machen? Ein Beispiel ist, dass MySQL keine Zeitzonen mit dem Typ DATETIME unterstützt. Wenn Sie also ORMs wie sqlalchemy verwenden, wird die Zeitzone einfach entfernt, wenn Sie ihr ein datetime.datetimeObjekt zum Einfügen in die Datenbank geben. Die Lösung besteht darin, Ihr datetime.datetimeObjekt in UTC zu konvertieren (also ist alles in Ihrer Datenbank UTC, da es keine Zeitzone angeben kann) und es dann entweder in die Datenbank einzufügen (wo die Zeitzone sowieso entfernt wird) oder es selbst zu entfernen. Beachten Sie auch, dass Sie keinedatetime.datetime Objekte vergleichen können, bei denen eines zeitzonenbewusst und ein anderes zeitzonennaiv ist.

##############################################################################
# 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
quelle