2012-09-10 2 views
1

나는 장고 앱 Pyroven으로 작업 중이며 기능의 주요 재 작업을하고 있습니다. 이것의 일부로, 현재로서는 단위 테스트가 없기 때문에 테스트 프레임 워크를 작성하기 시작했습니다. 백그라운드로 인증을 위해 University of Cambridge Raven service을 사용하고 Django에 대한 인증 백엔드를 사용하여이 서비스를 활용합니다.파이썬 트리거 오류에서 시간과 날짜 시간의 차이점

내가 겪고있는 문제는 Raven의 WLS-Response 토큰을 테스트하는 것입니다. 이 형식의 시간 필드에 포함 !로 구분 된 값의 문자열 형성 :

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

을 한 다음에 있음을 반환 : 내 테스트 코드에서

%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의 값은 각각 2 초 및 10 초입니다.

이것은 내가 이해하지 못하는 시간을 처리하는 데있어 약간의 변동성이 있습니까? datetime.now() 생성 된 값을 datetime.timedelta (향후 2 시간)으로 입력하면이를 문자열로 변환하여 유효성 검사에 전달합니다. 이후에 시간 스탬프가 설정되어 있어도 실패하지는 않습니다. 코드의 논리적 인 읽기가 제안해야하는 것처럼 이것이 왜?

+1

사운드 나에게 시간대 문제처럼, GMT + 0200에 기회가 있으십니까? –

+0

흠 - 유럽/런던입니다. (BST) – jvc26

답변

2

당신은) calendar.timegm()에 의해 구문 분석으로 datetime.now()와 GMT (에 의해 반환 현지 시간 (사이에 혼란스러워지고 :

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

결론 :. 타임 스탬프에 값을 설정하는 대신 calendar.timegmtime.mktime를 사용

+0

Brilliant - 감사합니다. 시간 처리가 나를위한 퍼즐이었습니다. 그러나 - 설명 주셔서 감사합니다! – jvc26

관련 문제