読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

DOS バッチで曜日を算出:修正版

雑談 プログラム全般

mkw さんのご指摘の通り、以前紹介したコードにミスがありました。
前回のコードを使うと、 8 〜 12 月でコケます。。。 m(_ _)m
なので、修正版のコードを再掲出させて頂きます。ご迷惑をおかけ致しました。
# ついでに、サブルーチン内の一箇所で変数名を間違っていた( CHECKDAY を使うべきところで DAY を使っていた)ので、そこもあわせて修正しています。

@echo off
setlocal

REM 日付の抽出
set YEAR=%DATE:~0,4%
set MONTH=%DATE:~5,2%
set DAY=%DATE:~8,2%

REM 算出の呼び出し
call :GETWEEK %YEAR% %MONTH% %DAY%

REM 結果表示
echo 対象日 = %YEAR%/%MONTH%/%DAY%
echo 曜日   = %ERRORLEVEL%
goto END

REM ----- 算出ロジック ここから -----
:GETWEEK
REM 引数の取得
set CHECKYEAR=%1
set CHECKMONTH=%2
set CHECKDAY=%3

REM ===== 2009/08/25 追加 ここから =====
REM 月と日の先頭 "0" を除去
if "%CHECKMONTH:~0,1%" == "0" (
  set CHECKMONTH=%CHECKMONTH:~1,1%
)
if "%CHECKDAY:~0,1%" == "0" (
  set CHECKDAY=%CHECKDAY:~1,1%
)
REM ===== 2009/08/25 追加 ここまで =====

REM 曜日の算出
if %CHECKMONTH% == 1 (
  set /A CHECKYEAR=%CHECKYEAR% - 1
  set /A CHECKMONTH=%CHECKMONTH% + 12
)
if %CHECKMONTH% == 2 (
  set /A CHECKYEAR=%CHECKYEAR% - 1
  set /A CHECKMONTH=%CHECKMONTH% + 12
)
set /A WEEK=(%CHECKYEAR% / 4 - %CHECKYEAR% / 100 + %CHECKYEAR% / 400 + (13 * %CHECKMONTH% + 8) / 5 + %CHECKDAY%) %% 7

exit /b %WEEK%
REM ----- 算出ロジック ここまで -----

:END
endlocal
@echo on