Come posso rimuovere un fuso orario pytz da un oggetto datetime?


122

C'è un modo semplice per rimuovere il fuso orario da un oggetto datetime pytz?
ad es. ricostruendo dtda dt_tzin questo esempio:

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

Risposte:


209

Per rimuovere un fuso orario (tzinfo) da un oggetto datetime:

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

Se stai usando una libreria come la freccia , puoi rimuovere il fuso orario semplicemente convertendo un oggetto freccia in un oggetto datetime, quindi facendo la stessa cosa dell'esempio sopra.

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

Perché lo faresti? Un esempio è che mysql non supporta i fusi orari con il suo tipo DATETIME. Quindi l'utilizzo di ORM come sqlalchemy rimuoverà semplicemente il fuso orario quando gli dai un datetime.datetimeoggetto da inserire nel database. La soluzione è convertire il tuo datetime.datetimeoggetto in UTC (quindi tutto nel tuo database è UTC poiché non può specificare il fuso orario) quindi inserirlo nel database (dove il fuso orario viene comunque rimosso) o rimuoverlo tu stesso. Si noti inoltre che non è possibile confrontare datetime.datetimeoggetti in cui uno conosce il fuso orario e un altro lo è ingenuo.

##############################################################################
# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.