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

FOLLOW US

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!