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.datetime
nesnenizi 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.datetime
bir 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