使用 pytz 處理 Python 中的時區問題

brandonbai發表於2019-04-23

介紹

pytz將 Olson tz 資料庫帶入Python。該庫允許使用Python 2.4或更高版本進行準確的跨平臺時區計算。它還解決了夏令時結束時模糊時間的問題。幾乎所有的 Olson 時區都得到了支援。

安裝

pip安裝

pip install pytz
複製程式碼

示例和用法

本地化時間和日期算術

>>> from datetime import datetime, timedelta
>>> from pytz import timezone
>>> import pytz
>>> utc = pytz.utc
>>> utc.zone
'UTC'
>>> beijing = timezone('Asia/Shanghai')
>>> beijing.zone
'Asia/Shanghai'
>>> tokyo = timezone('Asia/Tokyo')
>>> tokyo.zone
'Asia/Tokyo'
複製程式碼

該庫支援兩種構建本地化時間的方法。

  • 第一種是使用pytz庫提供的 localize() 方法。這用於本地化一個沒有時區資訊的日期時間:
>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'
>>> loc_dt = beijing.localize(datetime(2018, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
'2018-10-27 06:00:00 CST+0800'
複製程式碼
  • 第二種方法是使用標準 astimezone() 方法轉換現有的本地化時間:
>>> jp_dt = loc_dt.astimezone(tokyo)
>>> jp_dt.strftime(fmt)
'2018-10-27 07:00:00 JST+0900'
複製程式碼

處理時間的首選方法是始終以UTC工作,僅在生成輸出以供人類讀取時轉換為本地時間:

>>> utc_dt = datetime(2018, 10, 27, 6, 0, 0, tzinfo=utc)
>>> loc_dt = utc_dt.astimezone(beijing)
>>> loc_dt.strftime(fmt)
'2018-10-27 14:00:00 CST+0800'
複製程式碼

此庫還允許使用本地時間進行日期算術,例如計算北京和東京的時差:

>>> timestamp = datetime.utcnow()
>>> dt_cn = beijing.localize(timestamp)
>>> dt_jp =tokyo.localize(timestamp)
>>> x = dt_cn - dt_jp
>>> int(x.total_seconds()/3600)
1
複製程式碼

其他

UTC

'UTC'是協調世界時。它是格林威治標準時間(GMT)和世界時的各種定義的繼承者,但不同。UTC現在是調節時鐘和時間測量的全球標準。所有其他時區都是相對於UTC定義的,包括UTC + 0800等偏移量 - 從UTC新增或減去的小時數,以得出當地時間。UTC中沒有夏令時,這使得它成為執行日期算術的有用時區,而不用擔心夏令時轉換,所在國家/地區更改時區或漫遊多個時區的移動計算機造成的混亂和模糊。

夏令時

夏令時是在夏季推進時鐘的做法,以便晚上的日光持續時間更長,同時犧牲正常的日出時間。通常,使用夏令時的區域會在接近開始的一小時前調整時鐘,並在秋季將其向後調整到標準時間。

例如,在10月的最後一個星期天早上的美國東部時區,發生以下順序:

  • 01:00 EDT (東部夏令時) 發生
  • 1小時後,而不是凌晨2點,時鐘再次返回1小時,再次發生01:00 EST(東部標準時間)
>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
>>> eastern = timezone('US/Eastern')
>>> loc_dt = utc_dt.astimezone(eastern)
>>> before = loc_dt - timedelta(minutes=10)
>>> before.strftime(fmt)
'2002-10-27 00:50:00 EST-0500'
>>> eastern.normalize(before).strftime(fmt)
'2002-10-27 01:50:00 EDT-0400'
>>> after = eastern.normalize(before + timedelta(minutes=20))
>>> after.strftime(fmt)
'2002-10-27 01:10:00 EST-0500'
複製程式碼

事實上,01:00和02:00之間的每一個瞬間都會發生兩次。

連結

相關文章