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.datetime
obiekt do wstawienia do bazy danych. Rozwiązaniem jest przekonwertowanie datetime.datetime
obiektu 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.datetime
obiektó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