2012-06-08 17 views
65

Czy istnieje prosty sposób na usunięcie strefy czasowej z obiektu datac datac?
np. rekonstruowania dt od dt_tz w tym przykładzie:usunąć pytz timezone

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

Odpowiedz

115

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 takich jak arrow, można usunąć strefę czasową, po prostu przekształcając obiekt ze strzałką na obiekt datetime, a następnie robiąc to samo, co powyższy przykład.

# <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 typem DATETIME. Zatem użycie ORM-ów takich jak sqlalchemy spowoduje po prostu usunięcie strefy czasowej, gdy podasz obiekt datetime.datetime, aby wstawić go do bazy danych. Rozwiązaniem jest przekonwertowanie obiektu datetime.datetime na UTC (więc wszystko w bazie danych to UTC, ponieważ nie można określić strefy czasowej), a następnie albo wstaw to do bazy danych (gdzie strefa czasowa zostanie usunięta), albo usuń ją samodzielnie. Zauważ też, że nie może porównać datetime.datetime obiektów, w których jeden jest świadomy strefy czasowej i inny jest naiwny strefy czasowej.

############################################################################## 
# 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 
Powiązane problemy