繁体   English   中英

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

[英]In Python, how do you convert seconds since epoch to a `datetime` object?

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)

从纪元到datetimestrftime秒数:

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

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

蟒蛇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)

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

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

另见Issue1646728

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM