[INDEX] [TOP]

ブログ(バッチもん研究所blog)始めました!こちらのコメントでご感想をいただいても結構です!

バッチで日付の操作

ここでは、Windows2000/XP のコマンドプロンプトでの日付処理行うバッチファイルを紹介します。

バッチで本日の日付ファイル名を作るには
バッチで前日の日付を求める
指定した日(本日)の曜日を表示する
当月(指定月)のカレンダーを表示する
バッチファイルで日付関係の操作(2)

バッチで本日の日付ファイル名を作るには

バッチで本日の日付のファイル名を作る方法です。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


バッチファイルで日付関係の操作(2)

ちょっと高度な次のような日付処理は別ページへ...。


counter
Copyright (c) 2003-2007 じゃく
last update:2006-01-30
2nd update:2003-10-24
1st update:2003-07-03