python處理多時區相關問題

2021-09-07 23:58:21 字數 1841 閱讀 8708

隨著國際化的需求越來越多,在考慮多語言的同時也不可避免的要涉及到多時區的問題。

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對應...