Python時區的處理
發現python沒有簡單的處理時區的方法,不明白為什麼Python不提供一個時區模組來處理時區問題。 好在我們有個第三方pytz模組,能夠幫我們解決一下時區問題。
pytz簡單教程
pytz查詢某個的時區
可以根據國家代碼尋找這個國家的所有時區。
>>> import pytz
>>> pytz.country_timezones('cn')
['Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing', 'Asia/Urumqi', 'Asia/Kashgar']
pytz建立時區對象
根據上面得到的時區資訊,就可以建立指定的時區對象。比如建立上海時區對象:
tz = pytz.timezone('Asia/Shanghai')
得到某個時區的時間
然後在建立時間對象時進行指定上面時區,就可以得到指定時區的日期時間:
>>> import datetime
>>> datetime.datetime.now(tz)
二、擷取本地時區的N種方法
第一種方法:
說到使用python來操作timezone,首先想到的肯定是win32timezone了。。。
我試著用win32timezone擷取了一下,結果如下:
>>> from win32timezone import *
>>> now() datetime.datetime(2011, 4, 29, 17, 9, 24, 623000, tzinfo=TimeZoneInfo(u'China Standard Time', True))
>>> print now() 2011-04-29 17:09:27.154000+08:00
>>> print type(now()) <type 'datetime.datetime'>
>>> now().tzinfo TimeZoneInfo(u'China Standard Time', True)
>>> print now().tzinfo Unknown
>>> print type(now().tzinfo) <class 'win32timezone.TimeZoneInfo'>
列印的結果,可以看到: 使用函數,是可以得到結果,但是如果使用print之後,跟只使用函數是不同的,甚至列印win32timezone.now().tzinfo的結果卻是Unknow。我看到各種函數的類型之後,發現,他們本身是個class型(我猜的),不是str型,所以列印出來的結果是不同的
所以使用win32timezone的方法看來行不通,因為程式寫的長一點,是不可能用IDLE互動啟動並執行。。。
註:如果在編寫程式時提示"No module named 'win32timezone'" 則是沒有匯入模組
解決方案:from win32timezone import *
第二種方法:
後來我去看了timezone的函數原型,地址:%Python_Home%/Lib/site-packages/win32/lib/win32timezone.py
發現有一個函數是這麼寫的:
def _get_time_zone_key(subkey=None):
"Return the registry key that stores time zone details"
key = _RegKeyDict.open(_winreg.HKEY_LOCAL_MACHINE, TimeZoneInfo.tzRegKey)
if subkey:
key = key.subkey(subkey)
return key
所以,我發現,在python中擷取time zone key的方法是從註冊表中擷取,因為用了'_winreg',所以,既然調用win32timezone無效,那麼我也直接從註冊表中擷取。
TimeZone 的 位置為: [HKEY_CURRENT_USER/Software/Microsoft/Windows NT/CurrentVersion/Time Zones]
KeyName為: TimeZoneKeyName
所以我可以這麼擷取:
import _winreg key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r'Software/Microsoft/Windows NT/CurrentVersion/Time Zones')
value, type = _winreg.QueryValueEx(key, 'TimeZoneKeyName')
print value
#----Result:----#
>>> China Standard Time
所以用這種方法成功了。。。
廢話一句,其實用註冊表獲得索引值的方法很強大,一切跟win32相關的資訊,都可以從註冊表中獲得,例如使用者名稱之類的。。。
第三種方法:
今天無意閑看,發現了一個很簡單的方法,例子:
>>> import time
>>> str = time.strftime('%Z', time.localtime())
>>> print str
China Standard Time