Windows
dos

Windowsバッチで日付計算を扱う際の注意点

More than 1 year has passed since last update.

Windowsバッチで、日付の計算を行う必要があり、自作でロジックを組んだが、本番障害を起こしてしまった。

原因は、現在日(%DATE%)をそれぞれ年、月、日に分割して足し引きを行うところで、
日が10未満の場合に「08」のようになっており、
そのまま計算していたところで
「無効な数字です。数値定数は 10 進 (17 桁)、16 進 (0x11 桁)、または 8 進 (021 桁) です。」
というエラーで落ちてた。
これが8日と9日にだけ発生していた。

確かに本来は10未満の場合は「08」⇒「8」に変換してから計算すべきだったけど、
それは1日から7日までも同様だったはず。
しかも1日などはテストでもやっていたのに・・・

そのカラクリはこうだった。
DOSコマンドで数値は、先頭が「0」の場合は8進数とみなされる。
計算する際に10進数に暗黙的に変換されて処理されるが、
「01」~「09」の場合

「01」~「07」までは8進数を10進数に変換すると「1」~「7」になるため正しく処理される。
ただし、「08」、「09」の場合はそんな8進数は存在しない。
そのためエラーになったわけだ。

覚えておこう。
そしてちゃんと10未満以下の場合の変換を明示的に行うようにしよう。

回避策としては
月、日を変換する場合は年、月、日に分割した後、
分割後の文字列の左端に「1」を付与し、100を引くことで正しく変換できる。

例:
set dd = '08'
set /a dd = 1%dd% - 100