2012-09-10 44 views
1

我正在使用Django應用程序Pyroven,並且正在對其功能進行一些重大修改。作爲其中的一部分,我已經開始爲它編寫測試框架,因爲目前它沒有單元測試。作爲後臺,它使用University of Cambridge Raven service進行身份驗證,併爲Django提供身份驗證後端以利用此服務。python觸發器錯誤中的時間和日期時間差異

我遇到的問題是測試來自Raven的WLS-Response令牌。這形成!分隔值,其中包括在格式的時間字段的字符串:

%Y%m%dT%H%M%SZ 

在我的測試代碼,我已經創造了這個爲:

raven_issue = datetime.now().strftime('%Y%m%dT%H%M%SZ') 

,然後返回到測試URL以供視圖處理。這個問題伴隨着驗證,即過去這段時間對於響應的驗證並不太遠。這驗證該代碼使用:

def parse_time(t): 
    """Converts a time of the form '20110729T123456Z' to a number of seconds 
    since the epoch. 
    @exception ValueError if the time is not a valid Raven time""" 
    time_struct = time.strptime(t, "%Y%m%dT%H%M%SZ") 
    return calendar.timegm(time_struct) 

現在,當它從datetime.now()構造通過上面的字符串,在此分析得到的值的驗證失敗:

# Check that the issue time is not in the future or too far in the past: 
if self.issue > time.time() + PYROVEN_MAX_CLOCK_SKEW: 
    raise InvalidResponseError("The timestamp on the response is in the future") 
if self.issue < time.time() - PYROVEN_MAX_CLOCK_SKEW - PYROVEN_TIMEOUT: 
    raise InvalidResponseError("The response has timed out") 

此代碼失敗與我的測試,聲稱響應已超時。 PYROVEN_MAX_CLOCK_SKEWPYROVEN_TIMEOUT的值分別爲2s和10s。

這引出了一個問題,在處理時間上有一些變化,我不明白嗎?如果我將datetime.now()生成的值與將來的2小時的datetime.timedelta一起,將其轉換爲字符串並將其傳遞給驗證,儘管時間戳將來不會失敗,但應該如此。爲什麼這樣做,正如代碼的邏輯解讀所表明的那樣?

+1

聲音像我的時區問題;你是在GMT + 0200嗎? –

+0

嗯可能是 - 我是歐洲/倫敦(BST) – jvc26

回答

2

你得到本地時間(由datetime.now()和GMT(如calendar.timegm()解析)返回之間的混淆:

>>> t = datetime.now().strftime('%Y%m%dT%H%M%SZ') 
>>> t 
'20120910T232358Z' 
>>> calendar.timegm(time.strptime(t, "%Y%m%dT%H%M%SZ")) 
1347319438 
>>> time.mktime(time.localtime()) 
1347312258.0 
>>> time.mktime(time.strptime(t, "%Y%m%dT%H%M%SZ")) 
1347312238.0 

結論:使用time.mktime代替calendar.timegm把你的價值觀時間戳

+0

輝煌 - 謝謝,處理時間對我來說有點難以理解同時 - 謝謝澄清! – jvc26