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


248

所述time模块可使用秒因为历元进行初始化:

>>> 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以相同的方式初始化对象?


3
对于相反的操作,请转到此处:将日期时间对象转换为秒
Trevor Boyd Smith,

Answers:


404

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)

42
奇怪的是,datetime.utcfromtimestamp创建了一个简单的时间戳。我不得不import pytzdatetime.fromtimestamp(1423524051, pytz.utc)用来创建一个已知的日期时间。
马特

6
作为后续以上,与Python> = 3.2,你不必导入pytz库如果你只是想UTC时间戳-你只需要from datetime import datetime, timezone,然后调用它,如下所示:datetime.fromtimestamp(1423524051, timezone.utc)。当我只需要UTC时区时,它已多次保存了额外的库pytz
phouse512 '18

38

纪元以来的秒数来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.fromtimestamp(1579366345).strftime('%Y-%m-%d%H:%M:%S')
vml19

25

从文档中,从纪元以来的几秒钟内获取时区感知日期时间对象的推荐方法是:

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)

字幕中的文档链接(“ Python 3”,“ Python 2”)将非常有用-我也建议更改其顺序。
亚当·马坦

更新。顺序保持不变,因为它与Python文档匹配。
Meistro

您不需要pytz仅获取utctzinfo对象。自己创建很容易
jfs

9

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

如果时间戳不在平台C gmtime()函数支持的值范围内,则可能会引发ValueError。通常将其限制在1970年至2038年之间

另请参见Issue1646728


:o)是的,还有23年的时间才能解决问题
user3666197

5
您可以使用utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp)来解决它。
jfs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.