将 datetime 转换为 Unix 时间戳并将其转换回 python

新手上路,请多包涵

我有 dt = datetime(2013,9,1,11) ,我想获得这个日期时间对象的 Unix 时间戳。

当我这样做时 (dt - datetime(1970,1,1)).total_seconds() 我得到了时间戳 1378033200

使用 datetime.fromtimestamp 将其转换回来时,我得到了 datetime.datetime(2013, 9, 1, 6, 0)

小时不匹配。我在这里错过了什么?

原文由 kun 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 581
2 个回答

您在这里错过的是时区。

大概你有五个小时的 UTC,所以 2013-09-01T11:00:00 local 和 2013-09-01T06:00:00Z 是同一时间。

您需要阅读 datetime 文档的顶部,其中解释了时区以及“幼稚”和“感知”对象。

如果您最初的原始日期时间是 UTC,则恢复它的方法是使用 utcfromtimestamp 而不是 fromtimestamp

另一方面,如果您最初的原始日期时间是本地的,那么您首先不应该从中减去 UTC 时间戳;使用 datetime.fromtimestamp(0) 代替。

或者,如果您有一个感知日期时间对象,您需要在双方都使用本地(感知)纪元,或者显式转换为 UTC。

如果您拥有或可以升级到 Python 3.3 或更高版本,您可以通过使用 timestamp 方法来避免所有这些问题,而不是尝试自己弄清楚如何去做。即使你不这样做,你也可以考虑 借用它的源代码

(如果你可以等待 Python 3.4,看起来 PEP 341 很可能会进入最终版本,这意味着 JF Sebastian 和我在评论中讨论的所有内容都应该只使用 stdlib 就可以实现,并且在 Unix 和 Windows 上以相同的方式工作。)

原文由 abarnert 发布,翻译遵循 CC BY-SA 3.0 许可协议

解决方案是

import time
import datetime
d = datetime.date(2015,1,5)

unixtime = time.mktime(d.timetuple())

原文由 DmitrySemenov 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题