2017-12-11 21 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を使用してそれらの整数表現(UNIX時間)を比較したコードのバージョンでした:すべてのテストに合格し、ことをやったとき

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

を。しかし、それは事を行う珍しい方法です。もっと普通の方法があるべきだと思った。

その後、< = operatorを代わりにDateDiff(10行目をコメントアウトし、11行目をコメント解除してください)に置き換えました。私が数秒か数分かを問わず、テストは合格しました。だから、私はここでtakeawayの教訓はになると思うVBDateTimesを比較するときにDateDiffを使用すると常にです。しばらくの間VBSを使っていて、かつてはネイティブ比較の問題に遭遇したことのない人として、これは啓示であり、私は同僚にもこのアドバイスを提供する必要があるかもしれません。