2012-06-08 16 views
65

Saat dilimini pytz datetime nesnesinden kaldırmanın basit bir yolu var mı?
örn. Bu örnekte dt_tz den dt yeniden:pytz zaman dilimini kaldırma

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

Eğer arrow gibi bir kitaplığı kullanıyorsanız, o zaman basitçe tarafından dilimini kaldırabilirsiniz:

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

cevap

115

bir datetime nesneden bir zaman dilimini (tzinfo) kaldırmak için Bir ok nesnesini bir datetime nesnesine dönüştürmek, ardından yukarıdaki örnekle aynı şeyi yapmak.

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

Bunu neden yaptınız? Bir örnek, mysql'nin DATETIME türüyle saat dilimlerini desteklememesidir. Bu nedenle, ORM'nin sqlabchemy gibi kullanarak veritabanına eklemek için datetime.datetime nesnesini verdiğinizde zaman dilimini kaldırabilirsiniz. Çözüm, datetime.datetime nesnesini UTC'ye dönüştürmektir (bu nedenle zaman dilimi belirtilemediği için veritabanınızdaki her şey UTC'dir), ya veritabanına (zaten saat diliminin kaldırıldığı yer) veya kendiniz kaldırın. Ayrıca, 'un numaralı telefonunun, saat diliminin farkında olduğu ve başka bir zaman dilimi naif olduğu datetime.datetime nesnelerini kullanamayacağınızı unutmayın.

############################################################################## 
# 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 
İlgili konular