隨著國際化的需求越來越多,在考慮多語言的同時也不可避免的要涉及到多時區的問題。
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 datetime
import time
import dateutil
from dateutil.parser import parse
def 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上使用
附錄:
處理涉及時區的問題
1.有時會出現這樣的問題,本地 跑的很正常,到了伺服器上卻出現了問題,而且這種問題每次還很棘手,不好定位,這種問題很多都是因為時區不一致導致的 2.對於涉及時區的問題,都應該使用pyzt模組來解決,這個python包提供了奧爾森時區資料庫,這也是許多語言和作業系統所使用的時區資訊標準。3.pyzt模...
檔案處理相關問題
在有些web應用中,外界能夠通過傳入引數的形式來指定伺服器中的檔名。比如由外界引數來指定模板檔案的情況。這樣的web應用可能會招致以下攻擊。web應用中允許外界以引數的形式來指定伺服器上的檔名時,如果沒有對檔名進行充分的校驗 就可能會造成意料之外的問題,比如檔案被瀏覽 篡改或刪除。該安全隱患被稱為目...
PYTHON 與 DJANGO 的時區問題
在編碼中牽扯到時間問題的時候,總是容易被時區問題搞混,一直以來,都是反覆試驗應付過去,今天終於搞清楚了個中緣由,乙個心結也得以化解。環境變數 tz 對以上函式的影響 當系統中設定了環境變數 tz 的時候,或者在python中設定了 os.environ tz 的時候,上面的函式獲取的時間便是tz對應...