我在Windows 10 x64上使用Python 3.6.0。
我刚发现在time.ctime(seconds)
中,seconds
参数有一个隐含的最大值,即32536799999,几乎等于2^34.92135
。
这是最大值吗?
错误消息只是说它是无效的数字。
>>> import time
>>> time.ctime(32536799999)
>>> 'Mon Jan 19 15:59:59 3001'
>>> time.ctime(32536799999+1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
我用Google搜索并查看了Python文档,但我没有找到任何相关信息。我将在我的实验室中检查Ubuntu上的这个问题。
答案 0 :(得分:2)
time
文档没有提及任何限制,但datetime
documentation会:
如果时间戳超出平台Cfromtimestamp()
或OverflowError
功能支持的值范围,则{p>localtime()
可能会引发gmtime()
OSError
在localtime()
或gmtime()
失败。[...]
假定Naive
datetime
实例表示本地时间,并且此方法依赖于平台Cmktime()
函数来执行转换。由于datetime
在许多平台上支持的值范围大于mktime()
,因此此方法可能会在过去或将来的某个时间内提升OverflowError
。
然后我们前往Windows documentation:
使用_localtime64
结构的
__time64_t
允许日期在3000年12月31日23:59:59,协调世界时(UTC)之间表达,而_localtime32
代表2038年1月18日23:59:59,UTC的日期。
localtime
是一个内联函数,其结果为_localtime64
,而time_t
相当于__time64_t
。如果您需要强制编译器将time_t
解释为旧的32位time_t
,则可以定义_USE_32BIT_TIME_T
。执行此操作会导致localtime
评估为_localtime32
。建议不要这样做,因为您的应用程序可能在2038年1月18日之后失败,并且不允许在64位平台上使用。
所有与时间相关的功能(包括ctime
)都以相同的方式工作。因此,您可以在Windows 10上的时间戳之间可靠地转换的最大日期是3000-12-31T23:59:59Z。
尝试获取与平台无关的最大时间戳is difficult。
答案 1 :(得分:0)
我正在使用
3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:09:58) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
在Windows 10计算机上运行的Ubuntu 16.04 VM中。
我打破了你的ctime对其组件的调用,进行调查,但我没有达到相同的最大值。
>>> time.asctime(time.localtime(32536799999-1))
'Mon Jan 19 02:59:58 3001'
>>> time.asctime(time.localtime(32536799999+1))
'Mon Jan 19 03:00:00 3001'
>>> time.asctime(time.localtime(32536799999+10))
'Mon Jan 19 03:00:09 3001'
>>> time.asctime(time.localtime(32536799999+10000))
'Mon Jan 19 05:46:39 3001'
>>> time.asctime(time.localtime(32536799999+1000000))
'Fri Jan 30 16:46:39 3001'
>>> time.asctime(time.localtime(32536799999+1000000000))
'Thu Sep 27 05:46:39 3032'
>>> time.ctime(32536799999+1000000000)
'Thu Sep 27 05:46:39 3032'
>>> time.asctime(time.gmtime(32536799999-1))
'Mon Jan 19 07:59:58 3001'
>>> time.asctime(time.gmtime(32536799999+1))
'Mon Jan 19 08:00:00 3001'
>>> time.asctime(time.gmtime(32536799999+1000000000))
'Thu Sep 27 09:46:39 3032'
从3.6.0到3.6.1修复了一些问题,或者您的机器有一些特别有趣的问题。
我确实在3.6.1中看到了以下与时间相关的变化: https://www.python.org/dev/peps/pep-0495/ 我想知道你碰巧使用的时间是否恰好落入了折叠或间隙?您是否可以尝试在系统上添加1小时以上的时间并查看它是否再次生效?
答案 2 :(得分:0)
这必须与您在版本3.5
中安装Python有关,我从未遇到过这样的错误:
>>> time.ctime(32536799999)
'Mon Jan 19 07:59:59 3001'
>>> time.ctime(32536799999+1)
'Mon Jan 19 08:00:00 3001'
>>> time.ctime(32536799999+9999999999999999)
'Thu Feb 13 01:46:38 316890386'
>>> time.ctime(32536799999+99999999999999999)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 75] Value too large for defined data type
即使我使用巨大的数字,它也会引发不同的error
。