Python fromtimestamp OSError

时间:2016-05-28 03:44:17

标签: python

出于某种原因,当使用fromtimestamp构造日期时,当我使用小于-43200(-12hrs)的负时间时,我得到“OSError [Errno22]无效参数”。 我在Win7 64位和python 3.5.1上。这是产生错误的代码。

>>> import datetime
>>> import pytz
>>> datetime.datetime.fromtimestamp(-43200, pytz.utc)
datetime.datetime(1969, 12, 31, 12, 0, tzinfo=<UTC>)
>>> datetime.datetime.fromtimestamp(-43201, pytz.utc)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

该示例使用pytz来简化时区信息,但如果没有它,也会发生错误。

5 个答案:

答案 0 :(得分:9)

如果时间戳超出了平台C localtime()gmtime()函数支持的值范围,datetime.fromtimestamp()可能会引发您所看到的异常。

在Windows平台上,这个范围有时可能会限制在1970年到2038年之间。我从未在Linux系统上看到过这个问题。

答案 1 :(得分:7)

win的回答是正确的,但是到达这里的任何人都可能有兴趣测试它(如果你愿意,可以调整范围):

import datetime
import platform
print(
    "Running on Python ver.{} on {} {}\n" \
    .format(
        platform.python_version(),
        platform.system(),
        platform.release()
        )
)
for timestamp in range(1, 100000000):
    try:
        dt = datetime.datetime.fromtimestamp(timestamp)
    except:
        pass
    else:
        break
print(
    "Smallest accepted Unix timestamp by {}: '{}' ({})" \
    .format(platform.system(), timestamp, dt)
)

我得到的是:

A:\src\X.utilities>test.py
Running on Python ver.3.6.1 on Windows 7

Smallest accepted Unix timestamp by Windows: '86400' (1970-01-02 02:00:00)

答案 2 :(得分:7)

如果您收到此错误并且未使用明显错误的时间戳,请检查您的单位。

fromtimestamp期望以秒为单位的时间戳,而以毫秒为单位获取时间戳非常常见(例如,我在尝试解析日历小部件中Moment.js生成的时间戳时发现了这一点。)

采取时间戳1523443804214 - 这是2018年4月11日,在我发布这篇文章前约15分钟。根据{{​​3}},没问题,但请注意: “假设此时间戳以毫秒为单位:”

在Python中,这会返回一个OSError:

In [15]: datetime.fromtimestamp(1523443804214.0)
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-15-0c8efd251031> in <module>()
----> 1 datetime.fromtimestamp(1523443804214.0)

但是,如果我们除以千:

In [17]: datetime.fromtimestamp(1523443804.214)
Out[17]: datetime.datetime(2018, 4, 11, 11, 50, 4, 214000)

结果就是我们所期望的。

答案 3 :(得分:3)

要解决此问题,请将时间戳值除以1000。

在Windows中,时间戳记数字乘以1000。

答案 4 :(得分:-7)

时间戳是自1970年1月1日以来的秒数,这始终是正值。