問題描述
我有 dt = datetime(2013,9,1,11)
,我想獲取這個 datetime 對象的 Unix 時間戳.
I have dt = datetime(2013,9,1,11)
, and I would like to get a Unix timestamp of this datetime object.
當我執行 (dt - datetime(1970,1,1)).total_seconds()
時,我得到了時間戳 1378033200
.
When I do (dt - datetime(1970,1,1)).total_seconds()
I got the timestamp 1378033200
.
當使用 datetime.fromtimestamp
將其轉換回來時,我得到了 datetime.datetime(2013, 9, 1, 6, 0)
.
When converting it back using datetime.fromtimestamp
I got datetime.datetime(2013, 9, 1, 6, 0)
.
時間不匹配.我在這里錯過了什么?
The hour doesn't match. What did I miss here?
推薦答案
你在這里錯過的是時區.
What you missed here is timezones.
假設您已經離開 UTC 五個小時,所以 2013-09-01T11:00:00 local 和 2013-09-01T06:00:00Z 是同一時間.
Presumably you've five hours off UTC, so 2013-09-01T11:00:00 local and 2013-09-01T06:00:00Z are the same time.
您需要閱讀 datetime
文檔的頂部,其中解釋時區和天真"和有意識"的對象.
You need to read the top of the datetime
docs, which explain about timezones and "naive" and "aware" objects.
如果您最初的原始日期時間是 UTC,則恢復它的方法是使用 utcfromtimestamp
而不是 fromtimestamp
.
If your original naive datetime was UTC, the way to recover it is to use utcfromtimestamp
instead of fromtimestamp
.
另一方面,如果您最初的原始日期時間是本地的,那么您一開始就不應該從中減去 UTC 時間戳;請改用 datetime.fromtimestamp(0)
.
On the other hand, if your original naive datetime was local, you shouldn't have subtracted a UTC timestamp from it in the first place; use datetime.fromtimestamp(0)
instead.
或者,如果您有一個感知日期時間對象,您需要在雙方都使用本地(感知)紀元,或者顯式轉換為 UTC.
Or, if you had an aware datetime object, you need to either use a local (aware) epoch on both sides, or explicitly convert to and from UTC.
如果您擁有或可以升級到 Python 3.3 或更高版本,則只需使用 timestamp
方法,而不是試圖自己弄清楚如何去做.即使你不這樣做,你也可以考慮借用它的源代碼.
If you have, or can upgrade to, Python 3.3 or later, you can avoid all of these problems by just using the timestamp
method instead of trying to figure out how to do it yourself. And even if you don't, you may want to consider borrowing its source code.
(如果您可以等待 Python 3.4,那么看起來 PEP 341 可能會使其進入最終版本,這意味著 JF Sebastian 和我在評論中討論的所有內容都應該僅使用 stdlib 即可實現,并且在 Unix 和 Windows 上以相同的方式工作.)
(And if you can wait for Python 3.4, it looks like PEP 341 is likely to make it into the final release, which means all of the stuff J.F. Sebastian and I were talking about in the comments should be doable with just the stdlib, and working the same way on both Unix and Windows.)
這篇關于將 datetime 轉換為 Unix 時間戳并將其轉換回 python的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!