将datetime转换为Unix时间戳并将其转换回python
我有dt = datetime(2013,9,1,11)
,我想获得这个date时间对象的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
文档的顶部,该文档解释了时区,“天真”和“意识”对象。
如果您的原始date时间是UTC,恢复它的方法是使用utcfromtimestamp
而不是fromtimestamp
。
另一方面,如果您的原始date时间是本地的,您不应该从中减去UTC时间戳; 改用datetime.fromtimestamp(0)
。
或者,如果你有一个知道的date时间对象,你需要使用一个本地(意识)纪元双方,或明确转换为UTC和从UTC。
如果您已经或者可以升级到Python 3.3或更高版本,那么可以通过使用timestamp
方法来避免所有这些问题,而不是试图自己去做。 即使你不这样做,你也可以考虑借用它的源代码 。
(如果您可以等待Python 3.4,看起来PEP 341很可能会成为最终版本,这意味着JF Sebastian和我在评论中讨论的所有内容都应该可以通过stdlib来实现,而且在Unix和Windows上都以相同的方式工作。)
解决scheme是
import time import datetime d = datetime.date(2015,1,5) unixtime = time.mktime(d.timetuple())
而不是这个expression式来从dt
创build一个POSIX时间戳,
(dt - datetime(1970,1,1)).total_seconds()
用这个:
int(dt.strftime("%s"))
我使用第二种方法在你的例子中得到了正确的答案。
编辑:一些后续…经过一些评论(见下文),我很好奇缺乏支持或%s
在strftime
。 这是我发现的:
在datetime
和time
的Python源代码中,stringSTRFTIME_FORMAT_CODES
告诉我们:
"Other codes may be available on your platform. See documentation for the C library strftime function."
所以现在如果我们用man strftime
(在Mac OS X等BSD系统上),你会发现对%s
支持:
"%s is replaced by the number of seconds since the Epoch, UTC (see mktime(3))."
无论如何,这就是为什么%s
在它所做的系统上工作。 但是对OP的问题有更好的解决scheme(考虑到时间区域)。 请参阅@abarnert在这里接受的答案。
如果你想把Python的date时间转换成自从时代以来的秒数,你应该明确地做到这一点:
>>> datetime.datetime(2012,04,01,0,0).strftime('%s') '1333234800' >>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds() 1333238400.0
在Python 3.3+中,您可以使用timestamp()
来代替:
>>> datetime.datetime(2012,4,1,0,0).timestamp() 1333234800.0
那么,在转换为unix时间戳的时候,python基本上就是假设UTC,但是在转换回来的时候,它会给你一个转换为当地时区的date。
看到这个问题/答案; 获取datetime.datetime.fromtimestamp()使用的时区
您错过了时区信息(已经回答,同意)
arrow
包允许避免与date时间的这种折磨; 它已经被编写,testing,pypi出版,跨python(2.6 – 3.xx)。
所有你需要: pip install arrow
(或添加到依赖关系)
解决你的情况
dt = datetime(2013,9,1,11) arrow.get(dt).timestamp # >>> 1378033200 bc = arrow.get(1378033200).datetime print(bc) # >>> datetime.datetime(2013, 9, 1, 11, 0, tzinfo=tzutc()) print(bc.isoformat()) # >>> '2013-09-01T11:00:00+00:00'