2017-12-11 45 views
0

입력 한 시간이 추가 된 여유 시간보다 큰지 비교하는 ASP 페이지의 함수 작업 중입니다. 시간이 같을 때 검사가 실패하면 일정한 시간을 보았습니다. 설명 할 수있는 기능을 제공합니다. 동등한 날짜가 실패하는 이유를 모르거나 이것이 시간 비교에 대한 좋은 방법인지 알고 싶습니다.ASP 클래식에서 시간 비교/VBscript

<% 


function TimeTest(testTime, checkTime, buffer, try) 

checkingTime = FormatDateTime(cdate(DateAdd("n", buffer, cdate(checkTime))),4) 


if try = 1 then 
testTime = FormatDateTime(testTime, 4) 
checktime = FormatDateTime(checkTime, 4) 
end if 

if cdate(testTime) > DateAdd("n", buffer, cdate(checkTime)) then 
    TimeTest = "<p class = 'redS'>Fails! testTime: "&testTime&" < checkTime:"&checkingTime&"</p>" 
else 
    TimeTest = "<p class = 'greenS'>Works! testTime: "&testTime&" > checkTime:"&checkingTime&"</p>" 
end if 


end function 


response.write("<br><br><h1>Test2</h1><br>") 

for i=0 to 23 
    for j=0 to 59 

    response.write(TimeTest(i&":"&j&":00", i&":00:00", j, 1)) 
    response.write("<BR>") 

    next 
next 

%> 

답변

0

이 문제가 계속 발생했습니다. 나는 결과를 재현 할 수 있으며 이러한 비교에서 장면의 뒤에서 어떤 일이 벌어지고 있는지는 분명하지 않다. 당신이 여기

내가 문제를 분석하기 위해 사용했던 코드의 수정 된 버전 ... 주석하는 라인 13 라인을 드러내

<% 

Option Explicit 

Function TimeTest(a, b, buffer) 
    Dim c : c = DateAdd("n", buffer, b) 

    Dim s : s = Join(Array("a=" & a, "b=" & b, "c=" & c, "buffer=" & buffer), ", ") 

    Dim passed : passed = a <= c 
    'Dim passed : passed = DateDiff("s", a, c) <= 0 

    If passed Then Exit Function 

    Dim color : color = "red" : If passed Then color = "green" 
    TimeTest = "<div style='color:" & color & "'>" & s & "</div>" 
End Function 

Dim i, j, a, b 
For i = 0 To 23 
    For j = 0 To 59 
     a = CDate(i & ":" & j & ":00") 
     b = CDate(i & ":00:00") 
     'a = CDate(Date() & " " & i & ":" & j & ":00") 
     'b = CDate(Date() & " " & i & ":00:00") 
     Response.Write(TimeTest(a, b, j)) 
    Next 
    Response.Write("<hr>") 
Next 

%> 

주이기 때문이다 그러나, 나는 해결 방법을 가질 수 패스. 기본적으로 오류 만 표시하고 있습니다.

첫 번째로 주목해야 할 점은 24-25 행에 몇 가지 주석 처리 된 변형이있어이를 캐스팅하기 전에 오늘 날짜를 값에 추가하는 것입니다. 흥미롭게도이 작업을 수행하면 테스트가 실패한 패턴이 변경됩니다. 여전히 대략 동일한 수의 실패가 있지만 다른 버퍼 값에서 발생합니다.

이것은 VBScript의 배경에서 네이티브 < < =>> = 비교 연산자를 사용할 때 부동 소수점 숫자로 변환 될 수 있으며 이로 인해 일부 정밀도 오류가 발생합니다. 그것들이 긴 정수로 변환 되었다면, 그들은 틀림없이 정확해야합니다.

가 나는 코드의 버전을 대신 VBDateTimes에 직접적인 비교를 사용했다, 내가 this function를 사용하여 (유닉스 시간)의 정수 표현을 비교 :

Function date2epoch(myDate) 
    date2epoch = DateDiff("s", "01/01/1970 00:00:00", myDate) 
End Function 

이 그 일을 할 때, 모든 테스트 통과 . 그러나, 그것은 일을하는 비정상적인 방법입니다. 좀 더 '정상적인'방법이 있어야한다고 생각했습니다.

나는 다시 돌아가서 DateDiff에 대한 호출로 직접 < = 연산자를 대체했습니다 (줄 10의 주석 처리, 줄 11의 주석 처리 해제). 몇 초 또는 몇 분을 사용해도 테스트는 통과되었습니다. 그래서 여기서 테이크 어웨이 교훈은 일 것입니다. VBDateTimes를 비교할 때 항상을 사용하십시오. 한동안 VBS를 사용 해본 적이 없으며 이전에 네이티브 비교와 관련된 문제가 발생하지 않았기 때문에 이것은 계시이며 제 동료에게도이 조언을 제공해야 할 수도 있습니다.