ブログ(バッチもん研究所blog)始めました!こちらのコメントでご感想をいただいても結構です!
ここでは、Windows2000/XP のコマンドプロンプトでの日付処理行うバッチファイルを紹介します。
バッチで本日の日付のファイル名を作る方法です。YYYYMMDD.txt に作成した時刻を保存するサンプルです。 %DATE% が YYYY/MM/DD 形式のとき動作します。
set fname=%DATE:/=% echo 現在の時刻 %TIME% > %fname%.txt
バッチで前日の日付を求めます。月をまたぐ処理、閏年の判定も行っています。何も指定しないときは %DATE% が YYYY/MM/DD の形式として前日を求めます。結果は環境変数 ANS にセットします。
@echo off REM 日付の前日を求める REM 日付はYYYY/MM/DD 形式とする。結果は環境変数 ans へ返す。 REM 引数がないときは本日とする。 if "%1"=="" ( for /F "tokens=1" %%a in ('date /t') do set orgdate=%%a ) else ( set orgdate=%1 ) :年月日の分割 set yy=%orgdate:‾0,4% set mm=%orgdate:‾5,2% set dd=%orgdate:‾8,2% :月日の数値化(8進数対策) set /a mm=1%mm%-100 set /a dd=1%dd%-100 set /a dd=dd-1 if %dd% NEQ 0 goto end :月跨り処理 set /a mm=mm-1 if %mm% EQU 0 set mm=12&&set /a yy=yy-1 echo set sub=0030101001010 >sub.bat echo set /a dd=31-%%sub:‾%mm%,1%% >>sub.bat call sub.bat :後処理 if exist sub.bat del sub.bat :閏年処理 :4で割り切れるか? set /a u=yy %% 4 if not %u%==0 goto end :100で割り切れて、400で割り切れないか? set /a u=yy %% 400 set /a v=yy %% 100 if %v%==0 if not %u%==0 goto end :2月か? if %mm% EQU 2 set /a dd=dd+1 :end set mm=0%mm% set mm=%mm:‾-2% set dd=0%dd% set dd=%dd:‾-2% set ans=%yy%/%mm%/%dd% echo %ans%
指定した日付の曜日を計算します。日付を指定しないときは当日の曜日を表示します。
2003-07-03版では、以下の条件判定が抜けていました。訂正します。
if %mm% LEQ 2 (set /a yy=yy-1&&set /a mm=mm+12)
2003-10-24版では、%date%を使用していたため Windows2000で動作しませんでした!訂正します!
(けんぞうさんよりメールをいただきました。ありがとうございました。)
@echo off REM 日付の曜日を求める REM 日付はYYYY/MM/DD 形式とする。結果は環境変数 yobi へ返す。 REM 引数がないときは本日とする。 if "%1"=="" ( for /F "tokens=1" %%a in ('date /t') do set orgdate=%%a ) else ( set orgdate=%1 ) :年月日の分割 set yy=%orgdate:‾0,4% set mm=%orgdate:‾5,2% set dd=%orgdate:‾8,2% :月日の数値化(8進数対策) set /a mm=1%mm%-100 set /a dd=1%dd%-100 if %mm% LEQ 2 (set /a yy=yy-1&&set /a mm=mm+12) set /a ans=yy + yy/4 - yy/100 + yy/400 + (13*mm+8)/5 + dd set /a ans=ans %% 7 echo set day=日月火水木金土 >day.bat echo set yobi=%%day:‾%ans%,1%% >>day.bat call day.bat del day.bat echo %yobi%
カレンダーを表示します。YYYY-DD で年と月をハイフンでつないで指定月のカレンダーを表示することも出来ます。
前日の日付を求める処理と曜日を求める処理の応用で作りました。
◆カレンダーの表示の桁合わせのため空白の数が重要です。以下のソースをそのまま選択してメモ帳などで保存してください。
@echo off REM カレンダー表示 REM 日付はYYYY-MM 形式とする。 REM 引数がないときは本日とする。 :引数確認 if "%1"=="" ( for /F "tokens=1" %%a in ('date /t') do set orgdate=%%a ) else ( set orgdate=%1 ) :年月日の分割 set yy=%orgdate:‾0,4% set mm=%orgdate:‾5,2% :表題の表示 echo %yy%-%mm% echo Su Mo Tu We Th Fr Sa :月日の数値化(8進数対策) set /a mm=1%mm%-100 :1日の曜日を求める set lyy=%yy% set lmm=%mm% if %mm% LEQ 2 (set /a lyy=yy-1&&set /a lmm=mm+12) set dd=01 set /a day=lyy + lyy/4 - lyy/100 + lyy/400 + (13*lmm+8)/5 + dd set /a day=day %% 7 set /a pt=day * 3 + 1 echo set SP= >sub.bat echo set line=%%SP:‾0,%pt%%%>>sub.bat call sub.bat :月の最終日を求める echo set sub=0030101001010 >sub.bat echo set /a end=31-%%sub:‾%mm%,1%% >>sub.bat call sub.bat del sub.bat :閏年処理 :2月か? if %mm% NEQ 2 goto end :4で割り切れるか? set /a u=yy %% 4 if not %u%==0 goto end :100で割り切れて、400で割り切れないか? set /a u=yy %% 400 set /a v=yy %% 100 if %v%==0 if not %u%==0 goto end set /a end=end+1 :日付表示 :end for /L %%i in (1,1,%end%) DO call :echodays %%i if not "%line%"==" " echo %line% exit /b :echodays set /a x=(%1 + day) %% 7 set dd=0%1 set dd=%dd:‾-2% set line=%line%%dd% if %x% EQU 0 (echo %line% && set line= ) :pause goto :EOF
ちょっと高度な次のような日付処理は別ページへ...。