隨著國際化的需求越來越多,在考慮多語言的同時也不可避免的要涉及到多時區的問題。
python中對多語言也就是I18N的支援要好很多,但在多時區的處理上就稍微差一些,python標準庫中雖然在datetime提供了tzinfo ,但很可惜只是一個abstract class,使用者需要自己實現tzinfo。要實現local timezone的話可以藉助time模組的time.timezone來實現,但還是比較繁瑣。很奇怪的是,python標準庫中為何不提供一個local timezone?更令人費解的是python的datetime的strptime方法卻不支援帶時區的時間字串的解析。就目前的情況來看,如果想在不依賴於第三方開發包或者自己實現相關解析代碼的情況下,只能寄希望於python 3.X了,至少在python2.7.2的標準庫中還沒有看到很好解決方式。
就目前而來,要想妥善的解決python中的多時區問題的話,最好是採用 python-dateutil 和 pytz,兩個開發包各有千秋吧,但python-dateutil中的parser是pytz所短缺的,在解析時間串的時候很好用。
以下是一個簡單的程式碼範例,用於展示如何採用python-dateutil來完成帶時區字串的解析,以及怎麼藉助datetime來輸出帶時區標識的時間串:
# -*- encoding: utf-8 -*-import datetimeimport timeimport dateutilfrom dateutil.parser import parsedef test_format(): print "test time format with timezone" fmt = '%Y-%m-%d %H:%M:%S %z' now = datetime.datetime.now() print now.strftime(fmt) now = datetime.datetime.now(dateutil.tz.tzlocal()) now_str = now.strftime(fmt) print "now is: " print now_str print "utcnow is: " print datetime.datetime.utcnow() datestr = "2011-06-02 14:00:01+07" dt = parse(datestr) print "Original datetime ", dt.strftime(fmt) print "Local datetime ", dt.astimezone(dateutil.tz.tzlocal())
上述代碼運行結果如下:
>>>
test time format with timezone
2011-12-01 19:15:27
now is:
2011-12-01 19:15:27 +0800
utcnow is:
2011-12-01 11:15:27.745000
Original datetime 2011-06-02 14:00:01 +0700
Local datetime 2011-06-02 15:00:01+08:00
>>>
需要注意的是,在安裝python-dateutil時要根據python版本選擇合適的python-dateutil版本,目前而言,python2.X需要選擇python-dateutil 1.5, python-dateutil 2.0是針對python3.X的,不能在python2.X上使用
附錄:
python-dateutil :http://labix.org/python-dateutil
pytz :http://pytz.sourceforge.net/