日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

《Python Cookbook 3rd》笔记(3.16):结合时区的日期操作

發布時間:2023/12/13 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Python Cookbook 3rd》笔记(3.16):结合时区的日期操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

結合時區的日期操作

問題

你有一個安排在 2012 年 12 月 21 日早上 9:30 的電話會議,地點在芝加哥。而你的朋友在印度的班加羅爾,那么他應該在當地時間幾點參加這個會議呢?

解法

對幾乎所有涉及到時區的問題,你都應該使用 pytz 模塊。這個包提供了 Olson 時區數據庫,它是時區信息的事實上的標準,在很多語言和操作系統里面都可以找到。

pytz 模塊一個主要用途是將 datetime 庫創建的簡單日期對象本地化。比如,下面如何表示一個芝加哥時間的示例:

>>> from datetime import datetime >>> from pytz import timezone >>> d = datetime(2012, 12, 21, 9, 30, 0) >>> print(d) 2012-12-21 09:30:00 >>>>>> # Localize the date for Chicago >>> central = timezone('US/Central') >>> loc_d = central.localize(d) >>> print(loc_d) 2012-12-21 09:30:00-06:00 >>>

一旦日期被本地化了,它就可以轉換為其他時區的時間了。為了得到班加羅爾對應的時間,你可以這樣做:

>>> # Convert to Bangalore time >>> bang_d = loc_d.astimezone(timezone('Asia/Kolkata')) >>> print(bang_d) 2012-12-21 21:00:00+05:30 # Kolkata 的時區時區 UTC +05:30 >>>

如果你打算在本地化日期上執行計算,你需要特別注意夏令時轉換和其他細節。比如,在 2013 年,美國標準夏令時時間開始于本地時間 3 月 13 日凌晨 2:00(在那時,時間向前跳過一小時)。如果你正在執行本地計算,你會得到一個錯誤。比如:

>>> d = datetime(2013, 3, 10, 1, 45) >>> loc_d = central.localize(d) >>> print(loc_d) 2013-03-10 01:45:00-06:00 >>> later = loc_d + timedelta(minutes=30) >>> print(later) 2013-03-10 02:15:00-06:00 # WRONG! WRONG! >>>

結果錯誤是因為它并沒有考慮在本地時間中有一小時的跳躍。為了修正這個錯誤,可以使用時區對象 normalize() 方法。比如:

>>> from datetime import timedelta >>> later = central.normalize(loc_d + timedelta(minutes=30)) >>> print(later) 2013-03-10 03:15:00-05:00 >>>

討論

為了不讓你被這些東東弄的暈頭轉向,處理本地化日期的通常的策略先將所有日期轉換為 UTC 時間,并用它來執行所有的中間存儲和操作。比如:

>>> print(loc_d) 2013-03-10 01:45:00-06:00 >>> utc_d = loc_d.astimezone(pytz.utc) >>> print(utc_d) 2013-03-10 07:45:00+00:00 >>>

一旦轉換為 UTC,你就不用去擔心跟夏令時相關的問題了。因此,你可以跟之前一樣放心的執行常見的日期計算。當你想將輸出變為本地時間的時候,使用合適的時區去轉換下就行了。比如:

>>> later_utc = utc_d + timedelta(minutes=30) >>> print(later_utc.astimezone(central)) 2013-03-10 03:15:00-05:00 >>>

當涉及到時區操作的時候,有個問題就是我們如何得到時區的名稱。比如,在這個例子中,我們如何知道“Asia/Kolkata”就是印度對應的時區名呢?為了查找,可以使用 ISO 3166 國家代碼作為關鍵字去查閱字典 pytz.country timezones 。比如:

>>> pytz.country_timezones['IN'] ['Asia/Kolkata'] >>>

pytz文檔

:當你閱讀到這里的時候,有可能 pytz 模塊以及不再建議使用了,因為 PEP431提出了更先進的時區支持。但是這里談到的很多問題還是有參考價值的 (比如使用UTC 日期的建議等)。

總結

以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(3.16):结合时区的日期操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。