pytz格式化北京時(shí)間多出6分鐘問題的解決方法
起步
在django框架中,用的是 pytz 庫處理時(shí)區(qū)問題,所以我也嘗試用這個(gè)庫來處理。但發(fā)現(xiàn)了一個(gè)奇怪的問題:
import datetime
import pytz
dt = datetime.datetime(2019,6,20, 12, tzinfo=pytz.timezone('Asia/Shanghai'))
print(dt) # 2019-06-20 12:00:00+08:06
為什么多出了 6 分鐘來?
原因
這是因?yàn)?pytz 里保存是本地時(shí)間。
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 本地時(shí)間,也就是說 'Asia/Shanghai' 這個(gè)地區(qū)比utc多了8小時(shí)零6分鐘,并不是北京時(shí)間。
解決
所以 pytz 提供了 normalize() 方法來糾正這個(gè)問題,但傳入的得是不帶時(shí)區(qū)的日期對(duì)象:
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 也是采用這種處理方式。
時(shí)區(qū)轉(zhuǎn)換
以從北京時(shí)間轉(zhuǎn)紐約時(shí)間為例,已知結(jié)果它們之間應(yīng)該相差12小時(shí)。
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
額外
另一個(gè)解決時(shí)區(qū)問題就是使用標(biāo)準(zhǔn)庫的 dateutil 工具。官方內(nèi)置,值得信賴。它支持在創(chuàng)建日期對(duì)象的時(shí)候進(jìn)行設(shè)置,更為方便:
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
# 時(shí)區(qū)轉(zhuǎn)換(從北京時(shí)間轉(zhuǎn)到紐約時(shí)間)
ny = tz.gettz('America/New_York')
print(aware_dt.astimezone(tz=ny)) # 2019-06-20 00:00:00-04:00
我更喜歡這種方式。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
使用PyCharm和venv進(jìn)行Python項(xiàng)目環(huán)境配置避坑指南
在進(jìn)行 Python 項(xiàng)目開發(fā)時(shí),一個(gè)干凈,隔離且配置正確的開發(fā)環(huán)境至關(guān)重要,本文結(jié)合之前安裝 Vanna 庫時(shí)遇到的問題,總結(jié)了使用 PyCharm 和 venv 進(jìn)行 Python 項(xiàng)目環(huán)境設(shè)置的最佳實(shí)踐和常見坑的解決方法,有需要的小伙伴可以參考下2025-04-04
python連接PostgreSQL數(shù)據(jù)庫的過程詳解
這篇文章主要介紹了python連接PostgreSQL數(shù)據(jù)庫的過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Django動(dòng)態(tài)展示Pyecharts圖表數(shù)據(jù)的幾種方法
本文主要介紹了Django動(dòng)態(tài)展示Pyecharts圖表數(shù)據(jù)的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
Python自動(dòng)化部署工具Fabric的簡(jiǎn)單上手指南
這篇文章主要介紹了Python自動(dòng)化部署工具Fabric的簡(jiǎn)單上手指南,涵蓋Fabric的安裝、fabric的遠(yuǎn)程操作與維護(hù)等方面,需要的朋友可以參考下2016-04-04
Python釘釘報(bào)警及Zabbix集成釘釘報(bào)警的示例代碼
這篇文章主要介紹了Python釘釘報(bào)警及Zabbix集成釘釘報(bào)警的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

