最近開發過程中遇到這樣一個問題:
在使用datetime模塊獲取當前時間之後,與程序中某些時間操作會報錯:
TypeError: can't subtract offset-naive and offset-aware datetimes
這個我就有點納悶了,怎麼會報這個錯誤呢?然後我開始搜資料,原來在有兩種時間類型:naive和aware
-
naive
- 沒有表明時區的時間.如: datetime.datetime.now()
datetime.datetime(2019, 7, 8, 14, 13, 52, 534690)
-
aware
- 有時區的時間.如:datetime.datetime.now(pytz.utc)
datetime.datetime(2019, 7, 8, 6, 22, 16, 245504, tzinfo=<UTC>)
可以發現aware類型時間在打印對象信息時多了一個tzinfo,沒錯,這個就是用來標識時區的.而因爲我們獲取當前的時候沒有傳入時區,爲naive類型,所以與有些aware時間操作會發生異常,其實解決方法也很簡單,將naive轉化爲aware類型就好了,怎樣轉化呢?我找到了這幾種方式:
方式一
datetime.datetime.now().replace(tzinfo=pytz.utc)
方式二
datetime.datetime.now(pytz.utc)
方式三
pytz.utc.localize(datetime.datetime.now())
而第二種生成方式是在創建時間的時候指定時間,其他兩種可以用來轉化/修改時區.寫了這麼多,你們肯定在疑惑一個東西:pytz
這是一個時區模塊,用來在python中進行一個時區的相關操作.其提供的對象方法爲
__all__ = [
'timezone', 'utc', 'country_timezones', 'country_names',
'AmbiguousTimeError', 'InvalidTimeError',
'NonExistentTimeError', 'UnknownTimeZoneError',
'all_timezones', 'all_timezones_set',
'common_timezones', 'common_timezones_set',
]
接下來我們一個個介紹:
-
timezone:傳入一個時區,如:Asia/Shanghai,返回一個時區對象
pytz.timezone('Asia/Shanghai') >>> <DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
-
utc: 返回一個utc時區對象
pytz.utc >>> <UTC>
-
country_timezones:傳入一個國家英文縮寫,返回擁有的時區,如:中國('CN'),不傳則返回由247個國家縮寫爲key,時區爲值的dict
pytz.country_timezones('CN') >>> [u'Asia/Shanghai', u'Asia/Urumqi']
-
country_names:拿一個國家英文縮寫,返回國家完整英文名稱
pytz.country_names['CN'] >>> u'China'
-
all_timezones:所有時區的列表(591個)
pytz.all_timezones >>> ['Asia/Shanghai', 'Asia/Urumqi', ...] # 有591個,所以還是列一下咱們國家的時區
-
all_timezones_set:所有時區的集合
pytz.all_timezones_set >>> {'Asia/Shanghai', 'Asia/Urumqi', ...}
-
common_timezones:常用的時區列表(439個)
pytz.common_timezones >>> ['Asia/Shanghai', 'Asia/Urumqi', ...] # 有439個
-
common_timezones_set:常用的時區集合
pytz.common_timezones >>> {'Asia/Shanghai', 'Asia/Urumqi', ...}
- AmbiguousTimeError:模糊時間錯誤
- InvalidTimeError:無效時間錯誤
- NonExistentTimeError:不存在的時間錯誤
- UnknownTimeZoneError:未知的時區錯誤