将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")) 

我使用第二种方法在你的例子中得到了正确的答案。

编辑:一些后续…经过一些评论(见下文),我很好奇缺乏支持或%sstrftime 。 这是我发现的:

datetimetime的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'