出于某种原因,当使用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来简化时区信息,但如果没有它,也会发生错误。
答案 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日以来的秒数,这始终是正值。