python使用datetime.utcnow()問題解析
起步
執(zhí)行下面代碼:
import time from datetime import datetime, timezone, timedelta print(time.time()) print(datetime.utcnow().timestamp()) print(datetime.now(timezone.utc).timestamp()) print(datetime.now(timezone(timedelta(hours=2))).timestamp()) ==== output ==== 1626687759.9081082 1626658959.908108 1626687759.908108 1626687759.908108
發(fā)現,輸出的時間戳中只有 utcnow() 是不一樣,如果對比相差的時間能發(fā)現正好差8小時,而我電腦所在的時區(qū)正好是東八區(qū)。
原因
正如 utcnow() 文檔 所表明的那樣,它返回的是 naive time ,Naive datetime 實例被認為為表示本地時間,因此它的時間戳會比使用 now(None) 相差的時間正好是該電腦所在時區(qū)。
造成這種詭異處理方式的是有歷史原因的,在 Python 2 轉 Python 3 的過渡階段中,datetime.timezone 作為 3.2 版中的新功能被設計了出來,因此有了更為清晰明確的標記日期所在的時區(qū)。舊的接口 utcnow() 則保留了原先的處理方式。
新的時區(qū)的模型的處理方式與Python 2 存在兼容問題:
==== Python 2 ==== >>> from datetime import datetime >>> from dateutil import tz >>> datetime(2021, 5, 1).astimezone(tz.UTC) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: astimezone() cannot be applied to a naive datetime ==== Python 3 ==== >>> from datetime import datetime >>> from dateutil import tz >>> datetime(2021, 5, 1).astimezone(tz.UTC) datetime.datetime(2021, 5, 1, 4, 0, tzinfo=tzutc())
總結
綜上所述, utcnow() 可能是一個常見的陷阱。
我建議不要再使用 utcnow() 和 utcfromtimestamp() 。
以上就是python使用datetime.utcnow()問題解析的詳細內容,更多關于python datetime.utcnow()的資料請關注腳本之家其它相關文章!
相關文章
利用Anaconda創(chuàng)建虛擬環(huán)境的全過程
因為多次重新配置環(huán)境,這些命令每次都要用,每次都忘記,需要重新搜索,所以記錄這一過程,下面這篇文章主要給大家介紹了關于利用Anaconda創(chuàng)建虛擬環(huán)境的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-07-07
python復制列表時[:]和[::]之間有什么區(qū)別
這篇文章主要給大家介紹了關于python復制列表時[:]和[::]之間有什么區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-10-10
解決Django響應JsonResponse返回json格式數據報錯問題
這篇文章主要介紹了解決Django響應JsonResponse返回json格式數據報錯問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08

