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

Posted

技术标签:

【中文标题】在 Python 中,如何将自纪元以来的秒数转换为 `datetime` 对象?【英文标题】:In Python, how do you convert seconds since epoch to a `datetime` object? 【发布时间】:2011-04-11 07:18:12 【问题描述】:

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 对象?

【问题讨论】:

相反的操作去这里:convert-a-datetime-object-to-seconds 【参考方案1】:

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)

【讨论】:

奇怪的是,datetime.utcfromtimestamp 创建了一个简单的时间戳。我必须import pytz 并使用datetime.fromtimestamp(1423524051, pytz.utc) 来创建一个有意识的日期时间。 作为上述的后续,使用 Python >= 3.2 如果您只需要 UTC 时间戳,则不必导入 pytz 库 - 您只需要 from datetime import datetime, timezone 和然后按如下方式调用它:datetime.fromtimestamp(1423524051, timezone.utc)。当我只需要 pytz 的 UTC 时区时,它已经多次保存了额外的库。【参考方案2】:

从纪元到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,这取决于datetime 是否从datetime 导入(import datetimefrom datetime import datetime)。【参考方案3】:

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

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 文档匹配。 您不需要pytz 只是为了获取utc tzinfo 对象。 It is easy to create it yourself【参考方案4】:

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

“This may raise ValueError, if the timestamp is out of the range of values supported by the platform C gmtime() function. It’s common for this to be restricted to years in 1970 through 2038”

另见Issue1646728

【讨论】:

:o) 是的,还有大约 23 年的时间来修复它 您可以使用utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp) 来解决它。 这是个问题。美国有很多人是在 1970 年或 1969 年 12 月 31 日之前出生的!那些存储在 Java 中的 DOB 可能会在术中中断。【参考方案5】:

对于那些希望它符合 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() 方法。

【讨论】:

以上是关于在 Python 中,如何将自纪元以来的秒数转换为 `datetime` 对象?的主要内容,如果未能解决你的问题,请参考以下文章

在linux bash中将ISO日期转换为纪元以来的秒数

将 Zulu 时间戳转换为自纪元以来的秒数,并将其与 bash 脚本 Mac 中的当前时间进行比较

如何从 gmtime() 的时间 + 日期输出中获取纪元以来的秒数?

将 TLE 时间(十进制天数)转换为纪元后的秒数

从纪元到相对日期的秒数

在比较 jwt.iat(发布于)属性与当前日期时间时遇到问题 - (“自纪元以来的秒数”NumericDate)