パスワードを忘れた? アカウント作成
5951747 journal
マイクロソフト

uhyorinの日記: VBScriptでDateDiffのループチェック 3

日記 by uhyorin

このへんに触発されたので、VBScriptでうるう年判定ループ処理を書いてみた。
といっても真面目に年度判定をしているわけではなく、DateDiff() の整合性チェックみたいな感じになったけどな。

元旦~翌年元旦までの範囲で、DateDiff()の戻り値 = -365 ではない場合をうるう年とした場合。
cscript 1900to2010.vbs | more

    For intX = 0 to 2010
        dateBefore = String(4 - Len(intX), "0") & intX & "/01/01"
        dateAfter = String(4 - Len(intX + 1), "0") & intX + 1 & "/01/01"
        intRet = DateDiff("d", dateAfter, dateBefore)
        strRet = ""
        strRet = dateBefore & " to " & dateAfter & " = " & intRet & space(1) & Space(4 - Len(intX)) & intX & "年は"
        If (intRet = -365) Then
            strRet = strRet & "うるう年ではありません。"
        Else
            strRet = strRet & "うるう年です。"
            Call WScript.Echo(strRet)
        End IF
    Next

上記コードを動かすと、西暦29年と99年のときにDateDiff()が想定外の結果を返す。

0029/01/01 to 0030/01/01 = 36160 29年はうるう年です。
0099/01/01 to 0100/01/01 = 693595 99年はうるう年です。

日付の誤差がありすぎ…。
西暦 29年の場合、 36160 = 2029/01/01 - 1930/01/01
西暦 99年の場合、693595 = 1999/01/01 - 0100/01/01
となっているようなので、西暦が2桁の場合は省略形が用いられているところまではわかった。
しかし1929年(昭和4年)1999年(平成11年)に誤解釈されるのだろ。

日付の範囲の取り方を変更して、元旦~大晦日まで範囲で、DateDiff()の戻り値 = -364 ではない場合をうるう年とした場合。
cscript 1900to2010v2.vbs | more

    For intX = 0 to 2010
        dateBefore = String(4 - Len(intX), "0") & intX & "/01/01"
        dateAfter = String(4 - Len(intX), "0") & intX & "/12/31"
        intRet = DateDiff("d", dateAfter, dateBefore)
        strRet = ""
        strRet = dateBefore & " to " & dateAfter & " = " & intRet & space(1) & Space(4 - Len(intX)) & intX & "年は"
        If (intRet = -364) Then
            strRet = strRet & "うるう年ではありません。"
        Else
            strRet = strRet & "うるう年です。"
            Call WScript.Echo(strRet)
        End IF
    Next

これだったら問題無さそう。

# FizzBuzz for VBSがもう5年も前のやつだったとは。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson

読み込み中...