在 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】:
从纪元到datetime
到strftime
的秒数:
>>> 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 datetime
与from 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` 对象?的主要内容,如果未能解决你的问题,请参考以下文章
将 Zulu 时间戳转换为自纪元以来的秒数,并将其与 bash 脚本 Mac 中的当前时间进行比较