Jak mogę usunąć strefę czasową pytz z obiektu daty i godziny?

122

Czy istnieje prosty sposób na usunięcie strefy czasowej z obiektu datetime pytz?
np. rekonstruując dtz dt_tzw tym przykładzie:

>>> 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
źródło

Odpowiedzi:

209

Aby usunąć strefę czasową (tzinfo) z obiektu datetime:

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

Jeśli używasz biblioteki takiej jak strzałka , możesz usunąć strefę czasową, po prostu konwertując obiekt strzałki na obiekt z datą i godziną, a następnie robiąc to samo, co w przykładzie powyżej.

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

Dlaczego miałbyś to zrobić? Jednym z przykładów jest to, że mysql nie obsługuje stref czasowych z jego typem DATETIME. Tak więc użycie ORMów, takich jak sqlalchemy, po prostu usunie strefę czasową, gdy dasz jej datetime.datetimeobiekt do wstawienia do bazy danych. Rozwiązaniem jest przekonwertowanie datetime.datetimeobiektu na UTC (więc wszystko w twojej bazie danych jest UTC, ponieważ nie może określić strefy czasowej), a następnie wstaw go do bazy danych (gdzie strefa czasowa i tak jest usunięta) lub usuń ją samodzielnie. Pamiętaj również, że nie możesz porównywać datetime.datetimeobiektów, w których jeden jest świadomy strefy czasowej, a inny jest naiwny.

##############################################################################
# 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
źródło