同學們 Python 3.12 之後 datetime.utcnow() 與 datetime.utcfromtimestamp() 就進入退休清單囉
雖然 Python 3.12 還是可以使用 datetime.utcnow()
取得 UTC 的 datetime object, 不過會顯示 datetime.utcnow()
被 Deprecated 的警告。
p.s. datetime.utcfromtimestamp()
也是如此
datetime.utcnow()
之所以會被退休是因為 datetime.utcnow()
會回傳沒有時區(timezone)的 datetime object, 如果這時要取得 timestamp (也就是 1970-01-01 到現在的秒數),它會預設使用系統時區,所以秒數不是 UTC 時區的秒數,而是經過時區校正的秒數⋯⋯。
有興趣的話,可以玩看看下列 Python 程式碼,同樣都是使用 UTC 相關的函式,但是轉出來卻有 8 小時差距(因為 Taiwan 時區是 +8 )⋯⋯:
>>> from datetime import datetime
>>> utcnow = datetime.utcnow()
>>> utcnow
datetime.datetime(2023, 12, 10, 15, 14, 28, 710520)
>>> datetime.utcfromtimestamp(utcnow.timestamp())
datetime.datetime(2023, 12, 10, 7, 14, 28, 710520)
很明顯這 2 個函式名稱會誤導開發者⋯⋯。
那要怎麼在 3.12 之後正確取得 UTC 的 datetime 呢?
就統一都用 datetime.now(timezone.utc)
或者 datetime.now(datetime.UTC)
即可!
p.s. datetime.UTC
是 Python 3.11 起加入的
至於 datetime.utcfromtimestamp()
也請改用 datetime.fromtimestamp()
並帶入時區為 UTC 即可,例如:
>>> utcnow = datetime.now(datetime.UTC)
>>> datetime.fromtimestamp(utcnow.timestamp(), tz=datetime.UTC)
以上!