310

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同样的方式初始化一个对象?

4

5 回答 5

495

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)
于 2010-09-12T10:33:04.803 回答
50

自 epoch 到datetimeto 的秒数strftime

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

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

蟒蛇 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)
于 2016-01-08T04:48:58.460 回答
10

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

如果时间戳超出平台 C gmtime() 函数支持的值范围,这可能会引发 ValueError。这通常被限制在 1970 年到 2038 年的年份

另请参阅问题 1646728

于 2013-05-15T16:44:22.123 回答
3

对于那些希望它符合 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()方法选择不同的单位。

于 2020-12-02T13:49:35.183 回答