时间戳的最大值

时间:2017-09-09 17:20:36

标签: python windows time

我在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上的这个问题。

3 个答案:

答案 0 :(得分:2)

time文档没有提及任何限制,但datetime documentation会:

  如果时间戳超出平台C fromtimestamp()OverflowError功能支持的值范围,则{p> localtime()可能会引发gmtime() OSErrorlocaltime()gmtime()失败。

     

[...]

     

假定Naive datetime实例表示本地时间,并且此方法依赖于平台C mktime()函数来执行转换。由于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