pytz格式化北京時間多出6分鐘問題的解決方法
更多python教程請到友情連線: 菜鳥教程www.piaodoo.com
人人影視www.sfkyty.com
飛盧小說網www.591319.com
韓劇網www.op-kg.com
興化論壇www.yimoge.cn
星辰影院www.hhsos.net
起步
在django框架中,用的是 pytz 庫處理時區問題,所以我也嘗試用這個庫來處理。但發現了一個奇怪的問題:
import datetime import pytzdt = datetime.datetime(2019,6,20, 12, tzinfo=pytz.timezone('Asia/Shanghai'))
print(dt) # 2019-06-20 12:00:00+08:06
為什麼多出了 6 分鐘來?
原因
這是因為 pytz 裡儲存是本地時間。
fmt = '%Y-%m-%d %H:%M:%S %Z%z' dt = datetime.datetime(2019,6,20, 12, tzinfo=pytz.timezone('Asia/Shanghai')) print(dt.strftime(fmt)) # 2019-06-20 12:00:00 LMT+0806
LMT 即 Local Mean Time 本地時間,也就是說 'Asia/Shanghai' 這個地區比utc多了8小時零6分鐘,並不是北京時間。
解決
所以 pytz 提供了 normalize() 方法來糾正這個問題,但傳入的得是不帶時區的日期物件:
cn_zone = pytz.timezone('Asia/Shanghai') dt = cn_zone.localize(dt = datetime.datetime(2019,6,20, 12)) print(dt) # 2019-06-20 12:00:00+08:00 print(dt.strftime(fmt)) # 2019-06-20 12:00:00 CST+0800或者
dt = datetime.datetime(2019,6,20, 12)
print(dt.astimezone(cn_zone)) # 2019-06-20 12:00:00 CST+0800
這裡推薦的還是用 astimezone 的方式,django 也是採用這種處理方式。
時區轉換
以從北京時間轉紐約時間為例,已知結果它們之間應該相差12小時。
dt = datetime.datetime(2019,6,20, 12)print(dt.astimezone(tz=cn_zone)) # 2019-06-20 12:00:00+08:00
print(dt.astimezone(tz=cn_zone).astimezone(ny_zone)) # 2019-06-20 12:00:00-04:56
額外
另一個解決時區問題就是使用標準庫的 dateutil 工具。官方內建,值得信賴。它支援在建立日期物件的時候進行設定,更為方便:
cn = tz.gettz('Asia/Shanghai')aware_dt = datetime.datetime(2019,6,20, 12, tzinfo=cn)
print(aware_dt ) # 2019-06-20 12:00:00+08:00時區轉換(從北京時間轉到紐約時間)
ny = tz.gettz('America/New_York')
print(aware_dt.astimezone(tz=ny)) # 2019-06-20 00:00:00-04:00
我更喜歡這種方式。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對菜鳥教程www.piaodoo.com的支援。