在Python中,如何将自纪元以来的秒数转换为`datetime`对象?

时间:2010-09-12 10:28:53

标签: python datetime date time epoch

time模块可以使用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对象的优雅方法?

5 个答案:

答案 0 :(得分:338)

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)

答案 1 :(得分:29)

从纪元到datetimestrftime的秒数:

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

答案 2 :(得分:15)

从文档中,建议的方法是从epoch以来的秒数获取时区感知日期时间对象:

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)

答案 3 :(得分:7)

请注意,1970年1月1日之前的日期,Windows上的datetime.datetime。fromtimestamp(时间戳)和。utcfromtimestamp(时间戳)失败,而负的unix时间戳似乎适用于基于unix的平台。文档说这个:

  

This may raise ValueError, if the timestamp is out of the range of values supported by the platform C gmtime() function. It’s common for this to be restricted to years in 1970 through 2038

另见Issue1646728

答案 4 :(得分:1)

对于那些希望符合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()方法。