Python時區設定與擷取本地時區方法

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.