Skip to content

Instantly share code, notes, and snippets.

@aetos382
Last active August 29, 2015 14:02
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aetos382/538556e22d590eee92c1 to your computer and use it in GitHub Desktop.
Save aetos382/538556e22d590eee92c1 to your computer and use it in GitHub Desktop.
バッチファイルで指定日の前日を求める関数っぽいもの
@echo off
rem テスト
rem 何でもない日
call :GET_YESTERDAY "2014/06/13"
if "%result%" == "2014/06/12" (echo OK) else (echo NG)
rem 1 月以外の月初日
call :GET_YESTERDAY "2014/06/01"
if "%result%" == "2014/05/31" (echo OK) else (echo NG)
rem 1 月 1 日
call :GET_YESTERDAY "2014/01/01"
if "%result%" == "2013/12/31" (echo OK) else (echo NG)
rem 4 で割り切れて 100 で割り切れない年は閏年
call :GET_YESTERDAY "2012/03/01"
if "%result%" == "2012/02/29" (echo OK) else (echo NG)
rem 100 で割り切れて 400 で割り切れない年は閏年じゃない
call :GET_YESTERDAY "2100/03/01"
if "%result%" == "2100/02/28" (echo OK) else (echo NG)
rem 400 で割り切れる年は閏年
call :GET_YESTERDAY "2000/03/01"
if "%result%" == "2000/02/29" (echo OK) else (echo NG)
rem 月日は 1 桁で指定しても大丈夫
call :GET_YESTERDAY "2014/6/9"
if "%result%" == "2014/06/08" (echo OK) else (echo NG)
exit /b
:GET_YESTERDAY
rem 指定日の前日を求める関数
setlocal
set today=%~1
rem デフォルト値は今日
if "%today%" == "" set today=%date%
rem / 区切りで分割する
for /f "tokens=1,2,3 delims=/" %%i in ("%today%") do (
set year=%%i
set month=%%j
set day=%%k
)
rem 日が 1 より大きければ、日を 1 減らして終了
if %day% GTR 1 (
set /a day -= 1
goto :RESULT
)
rem 月が 1 より大きければ、月を 1 減らして末日をセットして終了
if %month% GTR 1 (
set /a month -= 1
call :GET_LAST
goto :RESULT
)
rem 年を 1 減らして末日を求める
set /a year -= 1
set month=12
call :GET_LAST
:RESULT
rem 月と日が 1 桁ならば前に 0 を補う
if "%month:~1,1%" == "" set month=0%month%
if "%day:~1,1%" == "" set day=0%day%
rem 結果をセット
endlocal & set result=%year%/%month%/%day%
exit /b
:GET_LAST
rem 末日を求める関数
setlocal
for /f "tokens=%month% delims=," %%i in ("31,28,31,30,31,30,31,31,30,31,30,31") do set day=%%i
rem 2 月でなければ閏年の計算はしない
if %month% NEQ 2 GOTO :GET_LAST_EXIT
set /a remainder1=%year% %% 4
set /a remainder2=%year% %% 100
set /a remainder3=%year% %% 400
rem 4 で割り切れない年は閏年ではない
if %remainder1% NEQ 0 GOTO :GET_LAST_EXIT
rem 100 で割り切れる年は、400 で割り切れないならば閏年ではない
if %remainder2% EQU 0 (if %remainder3% NEQ 0 GOTO :GET_LAST_EXIT)
rem 日付に 1 を足す
set /a day += 1
:GET_LAST_EXIT
endlocal & set day=%day%
exit /b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment