原文:[Python] 你知道 datetime.utcnow().timestamp() 不是 Unix Timestamp 吗?
最近在开发 Auth Module 的时候有用到 Unix Timestamp 来做验证,原先我的开发环境都是在 Container 下所以时区都是 UTC+0
不过自己写的小工具是在 UTC+8 的环境开发,于是乎学习到了 Python 的 bug (feature)...
原先我的 testing tool 是使用以下程式码来取得 Unix Timestamp
from datetime import datetimedatetime.utcnow().timestamp()
但我发现这样 Server 总是回我 Client 与自己的时间相差过大 (??
看到错误讯息我马上去检查是不是我的 local environment 时间没有校对,检查校对后重新再试一次又得到了同样的错误讯息
接着我想说死马当活马医乾脆用一般的方式拿 Unix Timestamp 试试看好了程式码如下
from datetime import datetimedatetime.now().timestamp()
竟然 pass 了!!!
到底花生神魔术,马上拿关键字去餵狗得到一篇 Using datetime.datetime.utcnow().timestamp() in Python3.6.0 can't get correct UTC timestamp.
大意是说 datetime.utcnow()
的 tzinfo = None
所以呼叫 timestamp()
的时候会帮你做减去当前时区再取得 Timestamp 的动作,而这样的行爲会造成无法取得预期 Unix Timestamp,原来...这不是 bug 这是 feature ...
嗯好... 总结一下取得 Unix Timestamp 的方法有两种:
time.time()datetime.now().timestamp()