我有 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 许可协议
您在这里错过的是时区。
大概你有五个小时的 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 上以相同的方式工作。)