我有dt = datetime(2013,9,1,11)
个,我想获得这个DateTime对象的Unix时间戳.
当我做(dt - datetime(1970,1,1)).total_seconds()
时,我得到了时间戳1378033200
.
当用datetime.fromtimestamp
把它转换回来时,我得到了datetime.datetime(2013, 9, 1, 6, 0)
.
时间不匹配.我在这里错过了什么?
我有dt = datetime(2013,9,1,11)
个,我想获得这个DateTime对象的Unix时间戳.
当我做(dt - datetime(1970,1,1)).total_seconds()
时,我得到了时间戳1378033200
.
当用datetime.fromtimestamp
把它转换回来时,我得到了datetime.datetime(2013, 9, 1, 6, 0)
.
时间不匹配.我在这里错过了什么?
你错过的是时区.
大概你离UTC还有五个小时,所以2013-09-01T11:00:00本地时间和2013-09-01T06:00:00Z是同一时间.
你需要阅读datetime
篇文档中的前几篇,它们解释了时区和"天真"和"感知"对象.
如果原始原始日期时间是UTC,那么恢复它的方法是使用utcfromtimestamp
而不是fromtimestamp
.
另一方面,如果您原始的日期时间是本地的,那么一开始就不应该从其中减go UTC时间戳;取而代之的是使用datetime.fromtimestamp(0)
.
或者,如果有aware datetime对象,则需要在两侧使用本地(aware)历元,或者显式地与UTC进行转换.
如果您拥有或可以升级到Python3.3或更高版本,那么只需使用timestamp
方法,而不是试图自己解决这些问题,就可以避免所有这些问题.即使你没有,你也可以考虑borrowing its source code.
(如果你能等Python3.4发布,看起来PEP 341很可能会进入最终版本,这意味着我和J.F.Sebastian在 comments 中谈到的所有东西都应该只用stdlib就可以做到,并且在Unix和Windows上都能以同样的方式工作.)