uhyorinの日記: VBScriptでDateDiffのループチェック 3
このへんに触発されたので、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年も前のやつだったとは。
西暦は100~じゃないかな? (スコア:0)
そんな気がするぞ
http://www.kanaya440.com/contents/script/vbs/function/date/date_serial.html [kanaya440.com]
Re: (スコア:0)
おまけとして2桁年解釈のルールとか
http://suika.fam.cx/~wakaba/wiki/sw/n/2%E6%A1%81%E8%A5%BF%E6%9A%A6%E5%... [suika.fam.cx]
Re: (スコア:0)
さらにおまけとして、タイムゾーンをUTCに変えると、結果変わったりして