最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python datetime 如何處理時區(qū)信息

 更新時間:2020年09月02日 11:16:37   作者:Yanbin  
這篇文章主要介紹了Python datetime 如何處理時區(qū)信息,幫助大家更好的用python 處理時間,感興趣的朋友可以了解下。

Python 常用日期處理 -- 內(nèi)置模塊 datetime 探討了 Python 如何使用 datetime, 如果是一個跨時區(qū)的應(yīng)用(Web 應(yīng)用都是),就不能只存儲一個時間而不帶時區(qū),如此,全球用戶將會看到一個相同的時間字符串,白天黑夜就錯亂了。比說用戶信息的更新時間存儲為 2020-07-07 13:46:08, 上海的用戶和芝加哥的用戶看到的是同一個時間字符串,實質(zhì)上卻相差好多個小時。

我們可以這么做,在服務(wù)端只存儲一個 Timestamp 長整型值或 UTC 時間,Timestamp 是無關(guān)乎時區(qū)的,它總是相對于一個 UTC 時間的偏移值; 然后由客戶端根據(jù)本地時區(qū)來顯示當?shù)貢r間。不過在服務(wù)端存儲為 Timestamp 或 UTC 可讀性就不強了,打開文件看到 Timestamp 整形值,大腦是無法直接轉(zhuǎn)換為日期,UTC 時間略好一些。

另一種做法可在服務(wù)端存儲為開發(fā)者便于理解的帶時區(qū)的時間,如 2020-07-07T13:46:08.342+08:00, 客戶獲得該時間,因為帶有時區(qū)信息也就能轉(zhuǎn)換為客戶端本地時間。

客戶端請求時還可以把本地的時區(qū)信息傳送給服務(wù)端,由服務(wù)端轉(zhuǎn)換為相應(yīng)的本地時間發(fā)送給客戶端,但 HTTP 頭信息默認不帶時區(qū)信息,客戶端必須主動發(fā)送它。

本人傾向于在服務(wù)端存為帶時區(qū)的時間,2020-07-07T13:46:08.342+08:00 是一個標準的存儲格式(ISO_OFFSET_DATE_TIME),客戶端收到它再轉(zhuǎn)換本地時間,JavaScript 一個很好的組件 moment 處理時間。

探索 Python 對時區(qū)的處理

Python 內(nèi)置組件不能像 Java 的 ZoneId.of("Asia/Shanghai") 直接以時區(qū)名獲得 Zone,而需要知道與標準時區(qū)的偏移,如上海是東八區(qū),在 Python 中要用 timezone(timedelta(hours=+8)).

那么來看 Python 中輸出帶時區(qū)信息,以下是一些應(yīng)用 Pytho 時區(qū) timezone 的例子

from datetime import datetime, timezone, timedelta
 
tz = timezone(timedelta(hours=+8))
 
fmt = '%Y-%m-%dT%H:%M:%S.%f%z'
zoned_time1 = datetime.today().astimezone(tz)
print(1, zoned_time1.strftime(fmt))  # 2020-07-08T04:30:26.221450+0800
 
zoned_time2 = datetime.now(tz)
print(2, zoned_time2.strftime(fmt))  # 2020-07-08T04:30:26.221543+0800
 
zoned_time3 = datetime.utcnow()
print(3, zoned_time3.isoformat())   # 2020-07-07T20:30:26.221848
 
print(4, zoned_time2.strftime('%Y-%m-%dT%H:%M:%S.%f%Z')) # 2020-07-08T04:30:26.221543UTC+08:00
 
timestamp = datetime.today().timestamp()
print(5, timestamp)         # 1594153826.221895
print(6, datetime.fromtimestamp(timestamp, tz=tz)) # 2020-07-08 04:30:26.221895+08:00
 
zoned_time4 = datetime(2020, 7, 8, 4, 23, 53, 112, tzinfo=tz)
print(7, zoned_time4.isoformat())  # 2020-07-08T04:23:53.000112+08:00
 
print(8, zoned_time2.isoformat())  # 2020-07-08T04:30:26.221543+08:00

輸出為, 已加到上面源代碼中

1 2020-07-08T04:30:26.221450+0800
2 2020-07-08T04:30:26.221543+0800
3 2020-07-07T20:30:26.221848
4 2020-07-08T04:30:26.221543UTC+08:00
5 1594153826.221895
6 2020-07-08 04:30:26.221895+08:00
7 2020-07-08T04:23:53.000112+08:00
8 2020-07-08T04:30:26.221543+08:00

時間字符串中要帶有時區(qū)信息,首先時間要轉(zhuǎn)換為帶時區(qū)的,如用

datetime.astimezone(tz)          # 已有時間轉(zhuǎn)換為帶時區(qū)的
datetime.fromtimestamp(timestamp, tz=tz) # 從 timestamp 構(gòu)建 datetime 時加上時區(qū)

找到 Python 輸出標準格式的方法

從上面的輸出結(jié)果看第 8 行 2020-07-08T04:30:26.221543+08:00 接近于 Java 的 ISO_OFFSET_DATE_TIME 格式,只是毫秒段 Python 用了 6 位數(shù)字,參考 strftime-strptime-behavior 的 Python datetime 格式字符串定義找不到如何把毫秒段收縮為 3 位。

不過注意到 datetime.isoformat() 方法還有一個 timespec 可用,執(zhí)行下面的代碼

from datetime import datetime, timezone, timedelta
 
tz = timezone(timedelta(hours=+8))
now = datetime.now(tz)
print(now.isoformat(timespec='milliseconds'))

輸出為

2020-07-08T04:41:10.793+08:00

這正式我們想要的。還不僅僅是,繼續(xù)往下讀,我們還需要讓 Python 支持夏令時,否則對于芝加哥時間夏天和冬天看到的都是 -5, 那是不對的。

pytz 組件構(gòu)建時區(qū)

Python 也有一個通過時區(qū)名稱獲得 timezone 的組件,那就是 pytz - Python TimeZone

$ pip install pytz

測試 pytz

from datetime import datetime
from pytz import timezone
 
tz_shanghai = timezone('Asia/Shanghai')
tz_chicago = timezone('America/Chicago')
 
print(datetime.now(tz=tz_shanghai).isoformat(timespec='milliseconds'))
print(datetime.now(tz=tz_chicago).isoformat(timespec='milliseconds'))

輸出為

2020-07-08T04:55:29.699+08:00
2020-07-07T15:55:29.699-05:00

關(guān)于夏令時與冬令時

國內(nèi)實行夏令時制還是很多年前的事了,80 后初期生人或許還有些印象,就是下午放了學走到街上就能看到《新聞聯(lián)播》。為了達成一切形式的統(tǒng)一,我們不再實行夏令時制了,避免了造成可能的分裂。但其他國家仍然有下令時,這會造成同一個地方在一年中產(chǎn)生兩個時區(qū)。

例如芝加哥,在夏季時 timezone 是 -05:00, 冬季時是 -06:00.

現(xiàn)在就來看一下 Python 是否能正確的處理夏令時(Date Saving Time)與冬令時(Night Saving Time)?;乜瓷厦娲a是在 7 月份執(zhí)行的結(jié)果,此時如果把本地時間改為 12 月份,再看輸出

2020-12-08T06:10:27.862+08:00
2020-12-07T16:10:27.862-06:00

上海的時區(qū)仍然為 +08:00, 而芝加哥的時區(qū)變成了 -06:00

Python 本身不支持對時令的支持,Python 只知道與 UTC 標準時區(qū)的偏移,timezone(timedelta(hours=-5),夏天冬天它的偏移都是 -5,實現(xiàn)夏令冬令時是由 pytz 達成的,同樣的 tz = timezone('America/Chiago')

夏天的結(jié)果是 Python 的 timezone(timedelta(hours=-5))
冬天的結(jié)果是 Python 的 timezone(timedelta(hours=-6))

對比 Java 對時區(qū)的處理

不妨看下隔壁 Java 是如何對時區(qū)處理的,分別測試了新舊時間 API

Date today = new Date();
System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(today));
 
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(now.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

2020-07-07T14:53:55.017-05:00
2020-07-08T03:53:55.031+08:00

小結(jié)一下

時間用 Timestamp(長整形值) 或統(tǒng)一的 UTC 時間存儲和傳輸,在顯示時轉(zhuǎn)換為本地時間,但存儲介質(zhì)上可讀性差
用 timezone(timedelta(hours=-5)) 應(yīng)用時區(qū)來存儲,可讀性增強,但會有夏/冬令時間誤差問題
用 pytz 的 timezone('America/Chicago') 由時區(qū)名來構(gòu)造 timezone 很好的解決了時區(qū)和夏/冬令時的問題

以上就是Python datetime 如何處理時區(qū)信息的詳細內(nèi)容,更多關(guān)于Python datetime 處理時區(qū)信息的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pyhton多線程采集圖片方式

    Pyhton多線程采集圖片方式

    這篇文章主要介紹了Pyhton多線程采集圖片方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • python之pexpect實現(xiàn)自動交互的例子

    python之pexpect實現(xiàn)自動交互的例子

    今天小編就為大家分享一篇python之pexpect實現(xiàn)自動交互的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python中選擇結(jié)構(gòu)實例講解

    Python中選擇結(jié)構(gòu)實例講解

    在本篇文章里小編給大家整理了關(guān)于Python選擇結(jié)構(gòu)的基礎(chǔ)知識點及相關(guān)實例,有需要的朋友們可以學習參考下。
    2022-11-11
  • python腳本監(jiān)控logstash進程并郵件告警實例

    python腳本監(jiān)控logstash進程并郵件告警實例

    這篇文章主要介紹了python腳本監(jiān)控logstash進程并郵件告警實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python PyGame五子棋小游戲

    python PyGame五子棋小游戲

    大家好,本篇文章主要講的是python PyGame五子棋小游戲,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • python實現(xiàn)差分隱私Laplace機制詳解

    python實現(xiàn)差分隱私Laplace機制詳解

    今天小編就為大家分享一篇python實現(xiàn)差分隱私Laplace機制詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 15個高級Python技巧提高代碼效率更加Pythonic

    15個高級Python技巧提高代碼效率更加Pythonic

    Python?是一種多用途、功能強大的編程語言,具有廣泛的特性和能力,在本文中,我們將探討?15?個高級?Python?技巧,它們有助于改善您的開發(fā)工作流程,并使您的代碼更加高效,更加?Pythonic
    2023-12-12
  • 如何通過python實現(xiàn)全排列

    如何通過python實現(xiàn)全排列

    這篇文章主要介紹了如何通過python實現(xiàn)全排列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • python遞歸計算N!的方法

    python遞歸計算N!的方法

    這篇文章主要介紹了python遞歸計算N!的方法,涉及Python遞歸計算階乘的技巧,非常簡單實用,需要的朋友可以參考下
    2015-05-05
  • 快速解決docker-py api版本不兼容的問題

    快速解決docker-py api版本不兼容的問題

    今天小編就為大家分享一篇快速解決docker-py api版本不兼容的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

武穴市| 资中县| 兴仁县| 锡林浩特市| 揭东县| 中山市| 醴陵市| 绥江县| 台前县| 慈溪市| 博爱县| 合川市| 宿松县| 大新县| 友谊县| 吴江市| 泗阳县| 收藏| 启东市| 潜江市| 万山特区| 库车县| 任丘市| 怀宁县| 沾益县| 延长县| 措勤县| 慈溪市| 沙坪坝区| 庆安县| 镇赉县| 介休市| 凤庆县| 滕州市| 承德市| 阿拉善左旗| 苏州市| 广昌县| 那曲县| 郧西县| 山西省|