はじめに
業務アプリケーション寄りのプログラマであれば一度は書いたであろう営業日判定のプログラム。
@mindwood さんが下記の通り良記事を書いてくれています。本当にありがとうございます。
【日本の祝日を判定するBashスクリプトを書いた件】
https://qiita.com/mindwood/items/d22689d3da61034751bd
宗教上の理由がありPowerShellが使えなかったため、今回はBATファイルで書きなおしました。
作業時間3時間くらい。私の業務範囲は十分にカバーできた都合で省力化したため、一部処理を省略しました。有志による改良を期待します。。。
結論
細かい仕様や注意事項などは元記事を参照してください。
check_holiday.bat
@echo off
rem ###############################################################
rem # 本邦休日判定スクリプト
rem # @translator Rocky.S
rem # @original MindWood
rem # @param チェック日付を yyyy/mm/dd で指定。省略すると今日を仮定
rem # @return 0 ... 確実に祝日
rem # 1 ... おそらく平日
rem # @usage check_holiday.bat || ”平日に必ず実行させるジョブ”
rem ###############################################################
rem 引数チェック
if "%1"=="" (
set CHECK_DATE=%date%
) else (
rem エラーチェックは(面倒なので)省略...
set CHECK_DATE="%1"
)
rem 内閣府提供の祝日ファイルをキャッシュするディレクトリ
set CACHE_PATH=%~dp0
rem 祝日登録ファイル名
set HOLIDAY_FILE=%CACHE_PATH%holiday.csv
rem 祝日ファイルをダウンロード
rem batでは日付の処理(特に加減算)が面倒なので更新が古い等の判定は省略 → 再取得は手動
if not exist %HOLIDAY_FILE% (
bitsadmin /transfer "holiday"
"https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv" %HOLIDAY_FILE%
)
rem ちなみにファイル更新日時は下記で取れます。誰か定期的な再取得の処理、実装してください。。。
rem for %%i in ( "%HOLIDAY_FILE%" ) do echo 祝日ファイル更新日時: %%~ti
rem (まずbat内で日付を取得/操作したいのでset_weekサブルーチンを実行する)
rem 土日なら 0 を返却して終了
call :set_week
if %WEEK% equ 0 (
exit /b 0
)
rem set_weekで操作した日付表現をcsvに合わせる
set TODAY_FORMATED=%y%/%m%/%d%
rem CSVに祝日として登録されていれば 0 を返却して終了
findstr %TODAY_FORMATED%, %HOLIDAY_FILE%
if "%ERRORLEVEL%"=="0" (
exit /b 0
)
rem 年末年始(12月31日~1月3日)なら 0 を返却して終了
rem 月日を2桁に固定するため、既定の桁数に削り(右から2桁)、出力
set d=0%d%
set m=0%m%
set TUKIHI=%m:~-2%%d:~-2%
rem 都合に合わせて自由に調整可能
set TRUE_FALSE=FALSE
IF %TUKIHI% equ 1231 set TRUE_FALSE=TRUE
IF %TUKIHI% equ 0101 set TRUE_FALSE=TRUE
IF %TUKIHI% equ 0102 set TRUE_FALSE=TRUE
IF %TUKIHI% equ 0103 set TRUE_FALSE=TRUE
IF %TRUE_FALSE%==TRUE (
exit /b 0
)
rem 上記いずれでもなければ平日として終了
exit /b 1
rem ===========================================
rem 以下、batで曜日を判定するためのサブルーチン
rem 引用と感謝 -> https://casualdevelopers.com/tech-tips/how-to-calc-week-day-with-bat/
rem ===========================================
:set_week
set TODAY=%date%
REM 日付の分解
set /a h=%TODAY:~0,2%
set /a y=%TODAY:~2,2%
set m1=%TODAY:~5,1%
set m2=%TODAY:~6,1%
if "%m2%" equ "/" (
set /a m=m1
set /a d=%TODAY:~7,2%
) else (
set /a m=m1*10+m2
set /a d=%TODAY:~8,2%
)
if %m%==1 ( set /a y-=1&set /a m+=12 )
if %m%==2 ( set /a y-=1&set /a m+=12 )
REM ツェラーの公式
set /a week_value=( y + (y/4) + (h/4) - 2*h + (13*(m+1)/5) + d ) %% 7
REM 曜日の設定
if %week_value%==0 set WEEK=0
if %week_value%==1 set WEEK=0
if %week_value%==2 set WEEK=1
if %week_value%==3 set WEEK=1
if %week_value%==4 set WEEK=1
if %week_value%==5 set WEEK=1
if %week_value%==6 set WEEK=1
exit /b
さいごに
BATファイルを書くことについて、イライラしないエンジニアはいないのではないだろうか。(よく頑張った自分)
@mindwood さま。事前了解などなく、記事の体裁をそのまま使用させていただきました。本記事についてよろしくない点等があれば忌憚なくご指摘ください。