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
对象?
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)
请注意,对于 1970 年 1 月 1 日之前的日期,datetime.datetime.fromtimestamp(timestamp) 和 .utcfromtimestamp(timestamp) 在 Windows 上失败,而负 Unix 时间戳似乎在基于 UNIX 的平台上工作。文档是这样说的:
”如果时间戳超出范围,可能会引发 ValueError 平台 C gmtime() 函数支持的值。常见于 这仅限于 1970 年至 2038 年”
另请参阅问题1646728
对于那些希望符合 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()方法。
秒(或分钟或小时等)是时间差,即 timedelta,因此另一种方法是将秒转换为
timedelta
对象并将其添加到 UNIX 纪元(即 1970-01-01 00:00: 00 世界标准时间)。
from datetime import datetime, timedelta, UTC
# for UTC datetime
datetime.fromtimestamp(0, UTC) + timedelta(seconds=1284286794)
# ^^^^^ UNIX epoch
# for naive datetime
datetime.fromtimestamp(0) + timedelta(seconds=1284286794)
此方法也适用于纪元之前的时间戳(即负秒),与直接将负数传递给
fromtimestamp
不同,这会引发 OSError(至少在 Windows 上)。
datetime.fromtimestamp(0, UTC) + timedelta(seconds=-1284286794)
在某种程度上相关的说明中,如果您已经在使用 numpy,那么您也可以使用
np.datetime64
将整数转换为日期时间。这些整数被解释为相对于 UNIX 纪元的偏移量。您只需使用 [s]
(几秒钟)通过单位。 numpy 的好处是,您可以将整个秒列表以向量方式转换为日期时间数组。
np.array([1284286794, 0, -1284286794], dtype='datetime64[s]')