【问题标题】:python3 fromtimestamp generates OSErrorpython3 fromtimestamp 生成OSError
【发布时间】:2020-05-27 17:30:46
【问题描述】:

我们在现场遇到了一个有趣的 mtime 问题。我正计划提交错误报告,但想获得外部视角。

存储在 Windows 服务器上的文件的最后修改日期为“1/1/4501”(即 4501 年)。 os.path.getmtime() 返回一个有效的时间戳,但是当我们尝试将其传递回 datetime.datetime.fromtimestamp() 时,我们得到一个 OSError

有几个关于 SO 的讨论围绕这个问题进行,例如:Python fromtimestamp OSError。但是,在我们可以找到的大多数情况下,OP 处理的制造日期显然超出了平台支持的纪元范围。当日期超过 Windows 上的 epoch 支持时生成 OSError 与 python 文档一致。

在我们的例子中,Windows 清楚地支持日期,这可以从它在文件系统中的存储中得到证明。此外,我们可以使用 cygwin touch 实用程序重现这种情况。

>>> import os, datetime
>>> os.system('touch -d "4501-01-01" file.txt')
>>> t = os.path.getmtime('file.txt')
>>> datetime.datetime.fromtimestamp(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

有趣的是我们可以手动根据纪元进行转换

>>> datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=t)
datetime.datetime(4501, 1, 1, 5, 0)

我们使用 Windows 10-Pro 进行运行 python 3.8.1 的测试。

【问题讨论】:

  • 你有什么问题??
  • 这在 Ubuntu 上对我有用。 t79870690800.0。我假设您使用的是 64 位 python?
  • 出于好奇,您系统上的t 是什么?

标签: python windows datetime


【解决方案1】:

好的,这不是错误,它是平台localtime()/gmtime() 的记录限制。虽然datetime 类本身可以处理任意日期,但对timestamp 的任何引用都需要通过平台的本地时间系统。就我而言,它是 Windows 10、64 位。

根据文档:https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/localtime-s-localtime32-s-localtime64-s?view=vs-2019

_localtime64_s,它使用 __time64_t 结构,允许日期表示到 3001 年 1 月 18 日 23:59:59,协调 世界标准时间(UTC)

传入大于 3001 年的值会导致 localtime64_s 返回 EINVAL。根据 python 文档:

如果时间戳超出范围,这可能会引发溢出错误 平台 C localtime() 函数和 OSError 支持的值 在 localtime() 失败时。

后者就是我们所看到的。

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2018-01-19
    相关资源
    最近更新 更多