Bagaimana cara menghapus zona waktu pytz dari objek datetime?

121

Apakah ada cara sederhana untuk menghapus zona waktu dari objek datetime pytz?
misalnya merekonstruksi dtdari dt_tzcontoh ini:

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

Jawaban:

208

Untuk menghapus zona waktu (tzinfo) dari objek datetime:

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

Jika Anda menggunakan library seperti panah , Anda dapat menghapus zona waktu hanya dengan mengonversi objek panah menjadi objek datetime, lalu melakukan hal yang sama seperti contoh di atas.

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

Mengapa Anda melakukan ini? Salah satu contohnya adalah mysql tidak mendukung zona waktu dengan tipe DATETIME-nya. Jadi menggunakan ORM seperti sqlalchemy hanya akan menghapus zona waktu saat Anda memberikan datetime.datetimeobjek untuk dimasukkan ke dalam database. Solusinya adalah mengonversi datetime.datetimeobjek Anda ke UTC (jadi semua yang ada di basis data Anda adalah UTC karena tidak dapat menentukan zona waktu) lalu memasukkannya ke dalam basis data (di mana zona waktu tetap dihapus) atau menghapusnya sendiri. Perhatikan juga bahwa Anda tidak dapat membandingkan datetime.datetimeobjek yang satu peka zona waktu dan yang lain naif zona waktu.

##############################################################################
# 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
pengguna1094786
sumber