在Python中,如何将秒从epoch转换为“datetime”对象?

time模块可以使用seconds since epoch初始化:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19,
tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

是否有一种优雅的方法以同样的方式初始化datetime.datetime对象?

375420 次浏览

datetime.datetime.fromtimestamp可以,如果你知道时区,你可以产生与time.gmtime相同的输出

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)

从纪元到datetimestrftime的秒数:

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'

请注意,datetime.datetime.fromtimestamp(timestamp)和. __abc1 (timestamp)在1970年1月1日之前的窗口上失败,而负的unix时间戳似乎在基于unix的平台上有效。医生说:

"如果时间戳超出的范围,则可能引发ValueError 平台C gmtime()函数支持的值。这很常见 这将限制在1970年至2038年"

另见Issue1646728

从文档中,从seconds since epoch获取一个时区感知datetime对象的推荐方法是:

Python 3:

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2,使用pytz:

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)

对于那些希望它符合ISO 8601的人,因为其他解决方案没有T分隔符也没有时间偏移(Meistro的答案除外):

from datetime import datetime, timezone
result = datetime.fromtimestamp(1463288494, timezone.utc).isoformat('T', 'microseconds')
print(result) # 2016-05-15T05:01:34.000000+00:00

注意,我使用fromtimestamp是因为如果我使用utcfromtimestamp,我无论如何都需要在.astimezone(...)上进行链接以获得偏移量。

如果你不想一直到microseconds,你可以用 isoformat ()方法。< / p >