Last active
April 13, 2019 11:40
-
-
Save jetstreamin/6241d88961aed03ced05f98878b21def to your computer and use it in GitHub Desktop.
DateMath.cmd - Add or subtract days from any date, copy the script below or download here and save as DateMath.cmdq
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@ECHO off | |
SETLOCAL | |
:: DateMath, a general purpose date math routine | |
:: If DateMath detects an error, variable _dd_int is set to 999999. | |
SET v_dd_int=0 | |
SET v_mm_int=0 | |
SET v_yy_int=0 | |
SET v_ymd_str= | |
SET v_mm_str= | |
SET v_dd_str= | |
IF "%3"=="" goto s_syntax | |
IF "%4"=="+" goto s_validate_year | |
IF "%4"=="-" goto s_validate_year | |
IF "%4"=="" goto s_validate_year | |
:s_syntax | |
echo: | |
echo DATEMATH SYNTAX: | |
echo _______________ | |
echo: | |
echo DateMath will set the variables as listed below | |
echo 'str' variables include leading zeros e.g. "01" | |
echo 'int' variables leading zeros are stripped e.g. "1" | |
echo: | |
echo CALL DateMath YY MM DD - YY2 MM2 DD2 | |
echo: | |
echo Will set variable _dd_int to the signed difference | |
echo between the 2 dates (measured in days) | |
echo: | |
echo: | |
echo CALL DateMath YY MM DD +/- Days | |
echo: | |
echo Will set the following variables to the result of | |
echo adding or substracting days from the initial date: | |
echo _ymd_str, _yy_int | |
echo _mm_str, _mm_int, | |
echo _dd_str, _dd_int | |
echo: | |
echo: | |
echo ___________________________________ | |
pause | |
echo: | |
echo: | |
echo CALL DateMath YY MM DD | |
echo: | |
echo Will set the following variables: | |
echo _ymd_str, _yy_int | |
echo _mm_str, _mm_int, | |
echo _dd_str, _dd_int | |
echo: | |
echo ___________________________________ | |
echo: | |
echo _ymd_str is in YYYYMMDD format. | |
echo: | |
echo _yy_int is in YYYY format, even if YY format was originally supplied. | |
echo This conversion is useful for FAT/NTFS file dates which are in YY format. | |
echo: | |
ENDLOCAL & SET /a _dd_int=999999 | |
goto :eof | |
:s_validate_year | |
::strip leading zeros | |
SET v_yy=%1 | |
if %v_yy:~0,1% EQU 0 set v_yy=%v_yy:~1% | |
:: Check for Y2K | |
IF %v_yy% LSS 100 IF %v_yy% GEQ 80 SET /A v_yy += 1900 | |
IF %v_yy% LSS 80 SET /A v_yy += 2000 | |
:: at this point v_yy contains a 4 digit year | |
::validate month and day | |
if %2 GTR 12 goto s_syntax | |
if %3 GTR 31 goto s_syntax | |
SET v_mm=%2 | |
SET v_dd=%3 | |
::strip leading zeros | |
if %v_mm:~0,1% EQU 0 set v_mm=%v_mm:~1% | |
if %v_dd:~0,1% EQU 0 set v_dd=%v_dd:~1% | |
:: Set the int variables | |
SET /a v_dd_int=%v_dd% | |
SET /a v_yy_int=%v_yy% | |
SET /a v_mm_int=%v_mm% | |
:: Determine which function to perform - ADD, SUBTRACT or CONVERT | |
If not "%6"=="" goto s_validate_2nd_date | |
if "%4"=="" goto s_convert_only | |
:: Add or subtract days to a date | |
SET /a v_number_of_days=%5 | |
goto s_add_or_subtract_days | |
:s_convert_only | |
SET /a v_dd_int=%v_dd% | |
IF %v_dd% LEQ 9 (SET v_dd_str=0%v_dd%) ELSE (SET v_dd_str=%v_dd%) | |
IF %v_mm% LEQ 9 (SET v_mm_str=0%v_mm%) ELSE (SET v_mm_str=%v_mm%) | |
SET v_ymd_str=%v_yy%%v_mm_str%%v_dd_str% | |
ECHO DATEMATH - Convert date only (no maths) | |
goto s_end | |
:::::::::::::::::::::::::::::::::::::::::::::::::: | |
:s_validate_2nd_date | |
If "%4"=="+" goto s_syntax | |
:: Subtracting one date from another :::::: | |
:: strip leading zero | |
SET v_yy2=%5 | |
if %v_yy2:~0,1% EQU 0 set v_yy2=%v_yy2:~1% | |
if %v_yy2% GTR 99 goto s_validate2nd_month | |
if %v_yy2% GTR 49 goto s_prefix_2_1950_1999 | |
if %v_yy2% LSS 10 goto s_prefix_2_2000_2009 | |
SET v_yy2=20%v_yy2% | |
goto s_validate2nd_month | |
:s_prefix_2_2000_2009 | |
SET v_yy2=200%v_yy2% | |
goto s_validate2nd_month | |
:s_prefix_2_1950_1999 | |
SET v_yy2=19%v_yy2% | |
:s_validate2nd_month | |
::strip leading zeros | |
::SET /a v_yy2=%v_yy2% | |
if %v_yy2:~0,1% EQU 0 set v_yy2=%v_yy2:~1% | |
::v_yy2 now contains a 4 digit year | |
if %6 GTR 12 goto s_syntax | |
SET v_mm2=%6 | |
if %7 GTR 31 goto s_syntax | |
SET v_dd2=%7 | |
::strip leading zeros | |
::SET /a v_mm2=%v_mm2% | |
if %v_mm2:~0,1% EQU 0 set v_mm2=%v_mm2:~1% | |
::SET /a v_dd2=%v_dd2% | |
if %v_dd2:~0,1% EQU 0 set v_dd2=%v_dd2:~1% | |
call :s_julian_day %v_yy_int% %v_mm_int% %v_dd_int% | |
SET v_sumdays1=%v_JulianDay% | |
call :s_julian_day %v_yy2% %v_mm2% %v_dd2% | |
SET v_sumdays2=%v_JulianDay% | |
SET /a v_dd_int=%v_sumdays1% - %v_sumdays2% | |
ECHO DATEMATH - Subtracting one date from another = days difference | |
ECHO ~~~~~~ | |
ECHO %v_dd_int% | |
ECHO ~~~~~~ | |
goto s_end_days | |
:::::::::::::::::::::::::::::::::::::::::::::::::: | |
:s_add_or_subtract_days | |
if /i "%4"=="+" goto s_add_up_days | |
:: Subtract all days :::::: | |
SET /a v_dd=%v_dd% - %v_number_of_days% | |
:s_adjust_month_year | |
if %v_dd% GEQ 1 goto s_add_subtract_days_DONE | |
SET /a v_mm=%v_mm% - 1 | |
if %v_mm% GEQ 1 goto s_add_days_%v_mm% | |
SET /a v_yy=%v_yy% - 1 | |
SET /a v_mm=%v_mm% + 12 | |
goto s_add_days_%v_mm% | |
:s_add_days_2 | |
SET /a v_dd=%v_dd% + 28 | |
SET /a v_leapyear=%v_yy% / 4 | |
SET /a v_leapyear=%v_leapyear% * 4 | |
if %v_leapyear% NEQ %v_yy% goto s_adjust_month_year | |
SET /a v_dd=%v_dd% + 1 | |
goto s_adjust_month_year | |
:s_add_days_4 | |
:s_add_days_6 | |
:s_add_days_9 | |
:s_add_days_11 | |
SET /a v_dd=%v_dd% + 30 | |
goto s_adjust_month_year | |
:s_add_days_1 | |
:s_add_days_3 | |
:s_add_days_5 | |
:s_add_days_7 | |
:s_add_days_8 | |
:s_add_days_10 | |
:s_add_days_12 | |
SET /a v_dd=%v_dd% + 31 | |
goto s_adjust_month_year | |
:s_add_up_days | |
:: add all days :::::: | |
SET /a v_dd=%v_dd% + %v_number_of_days% | |
:s_subtract_days_ | |
goto s_subtract_days_%v_mm% | |
:s_adjust_mth_yr | |
SET /a v_mm=%v_mm% + 1 | |
if %v_mm% LEQ 12 goto s_subtract_days_%v_mm% | |
SET /a v_yy=%v_yy% + 1 | |
SET /a v_mm=%v_mm% - 12 | |
goto s_subtract_days_%v_mm% | |
:s_subtract_days_2 | |
SET /a v_leapyear=%v_yy% / 4 | |
SET /a v_leapyear=%v_leapyear% * 4 | |
If %v_leapyear% EQU %v_yy% goto s_subtract_leapyear | |
if %v_dd% LEQ 28 goto s_add_subtract_days_DONE | |
SET /a v_dd=%v_dd% - 28 | |
goto s_adjust_mth_yr | |
:s_subtract_leapyear | |
if %v_dd% LEQ 29 goto s_add_subtract_days_DONE | |
SET /a v_dd=%v_dd% - 29 | |
goto s_adjust_mth_yr | |
:s_subtract_days_4 | |
:s_subtract_days_6 | |
:s_subtract_days_9 | |
:s_subtract_days_11 | |
if %v_dd% LEQ 30 goto s_add_subtract_days_DONE | |
SET /a v_dd=%v_dd% - 30 | |
goto s_adjust_mth_yr | |
:s_subtract_days_1 | |
:s_subtract_days_3 | |
:s_subtract_days_5 | |
:s_subtract_days_7 | |
:s_subtract_days_8 | |
:s_subtract_days_10 | |
:s_subtract_days_12 | |
if %v_dd% LEQ 31 goto s_add_subtract_days_DONE | |
SET /a v_dd=%v_dd% - 31 | |
goto s_adjust_mth_yr | |
:s_add_subtract_days_DONE | |
SET /a v_dd_int=%v_dd% | |
SET /a v_mm_int=%v_mm% | |
SET /a v_yy_int=%v_yy% | |
IF %v_dd% GTR 9 (SET v_dd_str=%v_dd%) ELSE (SET v_dd_str=0%v_dd%) | |
IF %v_mm% GTR 9 (SET v_mm_str=%v_mm%) ELSE (SET v_mm_str=0%v_mm%) | |
SET v_ymd_str=%v_yy%%v_mm_str%%v_dd_str% | |
ECHO DATEMATH - add or subtract days from a date = new date | |
goto s_end | |
:::::::::::::::::::::::::::::::::::::::::::::::::: | |
:s_julian_day | |
SET v_year=%1 | |
SET v_month=%2 | |
SET v_day=%3 | |
SET /a v_month=v_month | |
SET /a v_day=v_day | |
SET /A a = 14 - v_month | |
SET /A a /= 12 | |
SET /A y = v_year + 4800 - a | |
SET /A m = v_month + 12 * a - 3 | |
SET /A m = 153 * m + 2 | |
SET /A m /= 5 | |
SET /A v_JulianDay = v_day + m + 365 * y + y / 4 - y / 100 + y / 400 - 32045 | |
ECHO The Julian Day is [%v_JulianDay%] | |
goto :eof | |
:::::::::::::::::::::::::::::::::::::::::::::::::: | |
:s_end | |
ECHO ~~~~~~~~~~~~ | |
ECHO [%v_ymd_str%] YY=[%v_yy_int%] MM=[%v_mm_str%] DD=[%v_dd_str%] | |
ECHO ~~~~~~~~~~~~ | |
:s_end_days | |
ENDLOCAL&SET /a _yy_int=%v_yy_int%&SET /a _mm_int=%v_mm_int%&SET /a _dd_int=%v_dd_int%&SET _ymd_str=%v_ymd_str%&SET _mm_str=%v_mm_str%&SET _dd_str=%v_dd_str% | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment