gpt4 book ai didi

Python 在日期时间接近纪元的 Windows 上崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:25 26 4
gpt4 key购买 nike

Windows 10 上的 Python 3.7:

>>> from datetime import datetime
>>> datetime.fromtimestamp(0)
datetime.datetime(1970, 1, 1, 0, 0)
>>> datetime.fromtimestamp(0).timestamp()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
>>> datetime.fromtimestamp(3600 * 3).timestamp()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
>>> datetime.fromtimestamp(360000).timestamp()
360000.0

我知道在 Windows 上,由于 32 位整数大小,时间戳的范围限制在 1970 – 2038 之间。但是它在一个应该仍然允许的时间戳上崩溃真的很奇怪。 FWIW,我在 UTC+2,所以如果时区有问题,我希望 3600 * 3(3 小时)时间戳可以工作。我能以某种方式完成这项工作,还是我应该接受非常低的时间戳不起作用?

最佳答案

好的,我对 Python 的源代码做了一些挖掘。问题出在函数 _PyTime_localtime 中。这称为 localtime_s函数有两个参数 time_t tstruct tm *tm。其中 t 是要转换的 time_t 对象,tm 是生成的时间结构。当您将 0 作为 time_t 传递时,这是完全有效的,结果结构的字段 tm_hour 在我的机器上设置为 1。还有其他非 Windows 变体的代码,调用 localtime_r相反。

现在问题转移到内部使用的函数 utc_to_seconds,它采用时间结构(分为如下参数:int year, int month, int day, int hour, int分钟,整数秒)。现在对于年、月和日没有问题,它被转换为一个序数(顺便说一句,这是正确的序数)。但是函数的最后一行如下:

return ((ordinal * 24 + hour) * 60 + minute) * 60 + second;

EPOCH 应该在那里返回 62135683200,但由于这个额外的一小时,我们得到 62135686800。

这一切都在内部函数 local_to_seconds

long long t, a, b, u1, u2, t1, t2, lt;
t = utc_to_seconds(year, month, day, hour, minute, second);
/* Our goal is to solve t = local(u) for u. */
lt = local(t);
if (lt == -1)
return -1;
a = lt - t;
u1 = t - a;
t1 = local(u1);

其中 t = 62135683200lt = 62135686800。我们以 u1 = -3600 结束,这导致参数无效。

因此得出结论:问题出在您调用timestamp 时。我不确定在 C 代码中修复它的解决方案是什么,但我猜它肯定看起来像一个错误。

关于Python 在日期时间接近纪元的 Windows 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56931738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com