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

Ada*_*tan 220 python time datetime date 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)
Run Code Online (Sandbox Code Playgroud)

有一种优雅的方式以datetime.datetime相同的方式初始化对象吗?

Sil*_*ost 364

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

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)
Run Code Online (Sandbox Code Playgroud)

要么

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,`datetime.utcfromtimestamp`创建了一个天真的时间戳.我必须`import pytz`并使用`datetime.fromtimestamp(1423524051,pytz.utc)`来创建一个有意识的日期时间. (42认同)
  • 作为上述内容的后续,使用Python> = 3.2,如果您只需要UTC时间戳,则不必导入`pytz`库-您只需要`从datetime导入datetime,timezone`然后调用它如下所示:`datetime.fromtimestamp(1423524051,timezone.utc)`。当我只需要`pytz`的UTC时区时,它已经多次保存了额外的库。 (3认同)

小智 32

纪元以来的秒数来datetimestrftime:

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


Mei*_*tro 22

从文档中,从epoch开始,从秒开始获取时区感知日期时间对象的推荐方法是:

Python 3:

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)
Run Code Online (Sandbox Code Playgroud)

Python 2,使用pytz:

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)
Run Code Online (Sandbox Code Playgroud)


cba*_*are 7

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

" 如果时间戳超出了平台C gmtime()函数支持的值范围,这可能会引发ValueError.这种情况通常限制在1970年到2038年之间. "

另见Issue1646728

  • 你可以使用`utc_time = datetime(1970,1,1)+ timedelta(seconds = timestamp)`来解决它. (4认同)

Err*_*rse 6

对于那些希望它符合 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
Run Code Online (Sandbox Code Playgroud)

请注意,我使用是fromtimestamp因为如果我使用,utcfromtimestamp我无论如何都需要链接.astimezone(...)才能获得偏移量。

如果您不想一直这样做,可以使用isoformat()microseconds方法选择不同的单位 。