LoginSignup
22
12

More than 5 years have passed since last update.

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

Posted at

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

22
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
12