同學們 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)
以上!