Python 使用 timestamp 的注意事項
Posted on Jul 27, 2019 in Python 程式設計 - 初階 by Amo Chen ‐ 1 min read
Python 雖然有為 datetime 模組提供方便的 timestamp() 方法,但仍有需要注意的地方,否則將會導致我們拿到錯誤的時間戳(timestamp),衍伸出不必要的麻煩。
首先, Python 在文件中提到:
Naive datetime instances are assumed to represent local time …
當我們使用 datetime 時, datetime 預設會使用當地時間(也就是伺服器的時間及時區)。
以 UTC+8 的台灣為例,當我們試圖取得 2019 年 1 月 1 號的 timestamp 時,其數值為 1546272000.0
:
>>> from datetime import datetime
>>> datetime(2019, 1, 1).timestamp()
1546272000.0
但是如果我們真正想取得的是 UTC+0 2019 年 1 月 1 號的 timestamp 時,這麼做就會是錯的,必須明確指定時區才行:
>>> from datetime import datetime, timezone
>>> datetime(2019, 1, 1, tzinfo=timezone.utc).timestamp()
1546300800.0
從結果可以發現我們如果不指定時區(timezone)的話, 2 種 timestamp 呼叫所得到的數值差了 -28800
秒(1546272000 - 1546300800 剛好 8 小時),原因在於在不指定時區的情況下, Python 會先將當地時間先轉回 UTC+0 的時間再取得 timestamp ,因此 2019 年 1 月 1 號的台灣時間剛好對應到 UTC+0 的 2018 年 12 月 31 號 16:00 :
>>> from datetime import datetime, timezone
>>> datetime(2018, 12, 31, 16, 0, tzinfo=timezone.utc).timestamp()
1546272000.0
因此當我們試圖呼叫 timestamp() 請額外注意時區產生的問題,千萬別以為 datetime(2019, 1, 1).timestamp()
就是取得 UTC+0 的 2019 年 1 月 1 號的 UNIX timestamp 喔!
References
https://docs.python.org/3/library/datetime.html#datetime.datetime.timestamp