【发布时间】: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 上对我有用。
t是79870690800.0。我假设您使用的是 64 位 python? -
出于好奇,您系统上的
t是什么?