2016-05-28 135 views
8

由於某些原因,使用fromtimestamp構造日期時間時,當我使用小於-43200(-12小時)的負數時,我得到一個「OSError [Errno22]無效參數」。 我在Win7 64位和python 3.5.1上。這是產生錯誤的代碼。Python fromtimestamp OSError

>>> 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

這裏你兩行類似第一個打印值第二個拋出錯誤。所以我認爲有一些縮進錯誤或別的東西..所以嘗試捕捉異常使用除了OSError作爲e:然後把你的錯誤.. –

+2

這不是一個語法錯誤。此示例非常簡單,可以顯示導致錯誤的最低要求。我最初在for循環中找到了限制。 –

+0

對我來說同樣的問題是[python 3.6中的bug](https://stackoverflow.com/questions/42413138/python-3-6-datetime-fromtimestamp-throws-error-when-given-0) – dashesy

回答

-5

看來你不知道什麼是時間戳。時間戳是自1970年1月1日以來的秒數,並且這總是一個正值。

+5

-1 for不必要的屈尊。實際上,使用帶負數的'fromtimestamp'通常可以正常工作,但是它依賴於平臺。 – wim

+1

@ wim -1使用-1而不是-1 –

4

如果時間戳超出平臺C localtime()gmtime()函數支持的值範圍,datetime.fromtimestamp()可能會引發異常,如您所看到的。

在Windows平臺上,這個範圍有時會限制在1970年到2038年間。我從來沒有在Linux系統上看到過這個問題。

2

贏的答案是正確的,但其他人抵達這裏可能有興趣在測試它(如果你想調整範圍):

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)