Bir datetime nesnesinden bir pytz saat dilimini nasıl kaldırabilirim?


122

Saat dilimini pytz datetime nesnesinden kaldırmanın basit bir yolu var mı?
mesela yeniden dtgelen dt_tzbu örnekte:

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

Yanıtlar:


209

Bir tarih ve saat nesnesinden bir saat dilimini (tzinfo) kaldırmak için:

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

Ok gibi bir kitaplık kullanıyorsanız , bir ok nesnesini bir tarih saat nesnesine dönüştürerek ve ardından yukarıdaki örnekle aynı şeyi yaparak saat dilimini kaldırabilirsiniz.

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

Neden bunu yaptın? Bir örnek, mysql'nin DATETIME türü ile saat dilimlerini desteklememesidir. Öyleyse, ORM'nin benzer sqlalchemy'yi kullanmak datetime.datetime, veritabanına eklemek için bir nesne verdiğinizde zaman dilimini kaldıracaktır . Çözüm, datetime.datetimenesnenizi UTC'ye dönüştürmektir (bu nedenle veritabanınızdaki her şey saat dilimini belirtemediği için UTC'dir) ve ardından onu veritabanına (saat diliminin yine de kaldırıldığı yerde) ekleyin veya kendiniz kaldırın. Ayrıca unutmayın olamaz karşılaştırmak datetime.datetimebir zaman dilimi farkındadır ve başka zaman dilimi naif olduğu nesneler.

##############################################################################
# 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.