@echo off setlocal set _thisfile=weekday.cmd REM ############################################################################ REM REM weekday.cmd created by Mark Wolfgruber REM REM Feature Requests: REM - i'm searching for a good translation REM - calculate x-days ago REM - calculate in x-days REM - no more open requests REM REM open BUGs: REM - no more known bugs at the moment REM REM Version 0.0.3c Mark Wolfgruber 28.04.2009 REM - BUG: Year 00-09 was 20000 - 20009 now it is 2000 - 2009 REM - BUG: Weekday at the end of the year is possible in cw 1 REM - new option /clear REM - new option 0 REM - modify help file REM REM Version 0.0.3 Mark Wolfgruber 20.04.2009 REM - Variable _cwy replace _cw (Format: WEEK/YEAR) REM - new Variable _cw (Format: WEEK) REM - add a help REM - validate the date REM - _language_default=de REM - add _thisfile REM - BUG: Year 0-9 was 200 - 209 now it is 2000 - 2009 REM REM Version 0.0.2 Mark Wolfgruber 15.04.2009 REM - BUG-Behebung: Eingabe jetzt in _date (statt in _input) REM - Ergänze ein paar REM-Zeilen REM - Tag des Jahres berechnen REM - Schaltjahre (en: leap year) REM ~ sind alle Jahre, deren Jahreszahl ohne Rest durch vier teilbar sind. REM Der 29. Februar wird als Schalttag eingefügt. REM Alle Jahre, welche ohne Rest durch 100 teilbar sind, sind keine Schaltjahre. REM Ausgenommen von dieser Schaltjahresregelung sind volle Jahrhunderte, die REM nicht ohne Rest durch 400 teilbar sind. REM (2000 war ein Schaltjahr, 1900 nicht) REM - Kalenderwoche berechnen REM Grundlage: REM http://de.wikipedia.org/wiki/Woche#Z.C3.A4hlweise_nach_DIN_1355_.2F_ISO_8601 REM Formel zur Berechung der KW wurde von mir selbst entwickelt und REM ist ggf. nochmal zu prüfen REM Die Formel basiert auf der Annahme, dass der 4.1. immer in der KW 1 liegt REM REM Version 0.0.1 Mark Wolfgruber 14.04.2009 REM REM zweistellige Jahreszahlen 31-99 werden als 1931-1999 interprediert REM zweistellige Jahreszahlen 00-30 werden als 2000-2030 interprediert REM wird keine Jahreszahl angegeben wird das aktuelle Jahr verwendet REM wird kein Monat angegeben wird das aktuelle Monat verwendet REM wird kein Tag angegeben wird der aktuelle Tag verwendet REM Z.Zt. findet keine Prüfung auf unplausible Tage statt REM REM Aufruf z.B. REM für Heute: weekday.cmd %date% REM für den 1. des Monats: weekday.cmd 1. oder weekday.cmd 0/1 REM ############################################################################ REM REM Wochentagsberechnung nach Gauß ab 15.10.1582 REM REM Quelle der Formel: http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Wochentagsformel REM Umgesetzt in einem DOS-commandozeilen-Script nach einer Idee von Mark Wolfgruber REM REM Die Gaußsche Wochentagsformel ist eine Formel von Carl Friedrich Gauß REM zur Berechnung des Wochentags anhand eines gegebenen Datums. REM Sie wird häufig für die Berechnung der Wochentage in der Informatik eingesetzt. REM Die Formel gilt von der Einführung des Gregorianischen Kalenders am 15. Oktober 1582 REM an und prinzipiell solange, bis von diesen Kalenderregeln wieder abgewichen wird, REM also bis zur nächsten Kalenderreform. REM REM ############################################################################ :predifined_vars REM if you want to set it befor starting the script please REMark this lines set _date= set _language_default=de REM set _language_output= :vars if "%1" == "0" set _date=%date% REM try an Autodetection if "%1" == "" ( echo %date% | find "." >nul && set _oslanguage=de&& if "%_language_output%"=="" set _language_output=de echo %date% | find "/" >nul && set _oslanguage=en&& if "%_language_output%"=="" set _language_output=en ) ELSE ( if "%_language_output%"=="" echo %1 | find "/" >nul && set _language_output=en echo %date% | find "/" >nul && set _oslanguage=en if "%_language_output%"=="" echo %1 | find "." >nul && set _language_output=de echo %date% | find "." >nul && set _oslanguage=de ) REM define the output format if no enviroment is set if "%_language_output%"=="" set _language_output=%_language_default% REM to define the os language (date format) if %_oslanguage%=="" set _oslanguage=%_language_default% call :define_language_output_%_language_output% if not "%1"=="" set _date=%1 if /I "%1"=="/h" goto help if /I "%1"=="/help" goto help if /I "%1"=="/?" goto help if /I "%1"=="/clear" goto clear_vars if "%_date%"=="" set /p _date=%_ask_for_Date% [%date%]: if "%_date%"=="" set _date=%date% set _date=%_date:-=/% REM Autodetection Date-Input-Format echo %_date% | find "/" >nul && set _language_input=en echo %_date% | find "." >nul && set _language_input=de REM to define the input format if "%_language_input%"=="" set _language_input=%_language_default% :main call :split_date_%_language_input% call :set_month_value call :set_year_value call :def_leapyear call :calc_weekday call :def_daysb4 call :def_cwy endlocal & set _www=%_www%& set _ww=%_ww%& set _w=%_w%&set _longdate=%_longdate%&set _language_output=%_language_output%&set _d=%_d%&set _dd=%_dd%&set _m=%_m%&set _mm=%_mm%&set _yy=%_yy%&set _yyyy=%_yyyy%&set _dayofyear=%_dayofyear%&set _leapyear=%_leapyear%&set _cw=%_cw%&set _cwy=%_cwy% call :format_output_date_strings REM call :show_set_enviroment_output REM call :display goto end REM ############################################################################ ::functions :show_set_enviroment_output echo. echo SET Enviroment-Variables: set _ goto :EOF :format_output_date_strings set _date=%_yyyy%-%_mm%-%_dd% if %_cw% LEQ 9 ( set _cww=0%_cw% set _cwwy=0%_cwy% ) ELSE ( set _cww=%_cw% set _cwwy=%_cwy% ) if /I "%_language_output%"=="de" ( set _longdate=%_www%, %_dd%.%_mm%.%_cent%%_yy% ) ELSE ( set _longdate=%_www%, %_mm%/%_dd%/%_cent%%_yy% ) REM more examples ... rem set _datestr1=%_yyyy%-%_mm%-%_dd% rem set _datestr2=%_yy%-%_mm%-%_dd% rem set _datestr3=%_yyyy%%_mm%%_dd% rem set _datestr4=%_yy%%_mm%%_dd% rem set _datestr5=%_yy%%_m%%_d% goto :EOF :calc_weekday set _d=x0%_dd% set _d=%_d:x0=x% set _d=%_d:x0=x% set _d=%_d:x=% set /a _d=%_d%+0 if %_d% LSS 10 set _dd=0%_d% if %_d% GTR 31 set _dd=31& set _d=31 if %_m% EQU 2 ( if %_leapyear% EQU 1 ( if %_d% GTR 29 set _dd=29& set _d=29 ) ELSE ( if %_d% GTR 28 set _dd=28& set _d=28 ) ) if %_m% EQU 4 if %_d% GTR 30 set _dd=30& set _d=30 if %_m% EQU 6 if %_d% GTR 30 set _dd=30& set _d=30 if %_m% EQU 9 if %_d% GTR 30 set _dd=30& set _d=30 if %_m% EQU 11 if %_d% GTR 30 set _dd=30& set _d=30 REM Formel: w = (d + [2,6 m – 0,2] + y + [y/4] + [c/4] – 2c) mod 7 REM wobei für [2,6 m – 0,2] die Liste verwendet wird REM Ich nutze den Umstand, dass das Ergebnis nur aus Ganzzahlen besteht set /a _w0=( %_d% + %_m_val% ) + ( %_y2% ) + ( %_y2% / 4 ) + ( %_c2% / 4 ) - ( 2 * %_c2% ) set /a _w1=%_w0%/7 set /a _w=%_w0% - ( %_w1% * 7 ) if %_w% LSS 0 set /a _w=%_w%+7 call :weekdays goto :EOF :weekdays REM Korrektur für Sonntag=7 mit &set _w=7 if "%_w%"=="0" set _www=%_Sun%&set _ww=%_Su%&set _w=7 if "%_w%"=="1" set _www=%_Mon%&set _ww=%_Mo% if "%_w%"=="2" set _www=%_Tue%&set _ww=%_Tu% if "%_w%"=="3" set _www=%_Wed%&set _ww=%_We% if "%_w%"=="4" set _www=%_Thu%&set _ww=%_Th% if "%_w%"=="5" set _www=%_Fri%&set _ww=%_Fr% if "%_w%"=="6" set _www=%_Sat%&set _ww=%_Sa% goto :EOF :set_month_value set _m=x0%_mm% set _m=%_m:x0=x% set _m=%_m:x0=x% set _m=%_m:x=% set /a _m=%_m%+0 if %_m% LSS 10 set _mm=0%_m% if %_m% GTR 12 set _mm=12& set _m=12 REM Liste für [2,6 m – 0,2] if %_m% EQU 1 set _m_val=28 if %_m% EQU 2 set _m_val=31 if %_m% EQU 3 set _m_val=2 if %_m% EQU 4 set _m_val=5 if %_m% EQU 5 set _m_val=7 if %_m% EQU 6 set _m_val=10 if %_m% EQU 7 set _m_val=12 if %_m% EQU 8 set _m_val=15 if %_m% EQU 9 set _m_val=18 if %_m% EQU 10 set _m_val=20 if %_m% EQU 11 set _m_val=23 if %_m% EQU 12 set _m_val=25 goto :EOF :set_year_value set _c=%_cent% set _c2=%_c% set _y=x0%_yy% set _y=%_y:x0=x% set _y=%_y:x0=x% set _y=%_y:x=% set /a _y=%_y%+0 if %_y% LSS 10 set _yy=0%_y% set _y2=%_y% if %_m% EQU 1 call :set_correction if %_m% EQU 2 call :set_correction goto :EOF :set_correction if "%_y2%"=="0" ( set _y2=99 set /a _c2=%_c2%-1 ) ELSE ( set /a _y2=%_y2%-1 ) goto :EOF :define_language_output_ REM default if no datelanguage is set :define_language_output_en set _ask_for_Date=Date set _language_output=en set _Su=Su set _Mo=Mo set _Tu=Tu set _We=We set _Th=Th set _Fr=Fr set _Sa=Sa set _Sun=Sunday set _Mon=Monday set _Tue=Tuesday set _Wed=Wednesday set _Thu=Thursday set _Fri=Friday set _Sat=Saturday goto :EOF :define_language_output_de set _ask_for_Date=Bitte ein Datum eingeben set _Su=So set _Mo=Mo set _Tu=Di set _We=Mi set _Th=Do set _Fr=Fr set _Sa=Sa set _Sun=Sonntag set _Mon=Montag set _Tue=Dienstag set _Wed=Mittwoch set _Thu=Donnerstag set _Fri=Freitag set _Sat=Samstag goto :EOF :split_date_ REM default if no oslanguage is set :split_date_en FOR /F "usebackq tokens=1,2,3,4,* delims=/" %%a IN (`echo %_date%`) DO ( set _mm=%%a set _dd=%%b set _yyyy=%%c ) call :check_date set /a _cent=%_yyyy%/100 set /a _yy=%_yyyy% - ( %_cent% * 100 ) goto :EOF :split_date_de FOR /F "usebackq tokens=1,2,3,4,* delims=." %%a IN (`echo %_date%`) DO ( set _dd=%%a set _mm=%%b set _yyyy=%%c ) call :check_date set /a _cent=%_yyyy%/100 set /a _yy=%_yyyy% - ( %_cent% * 100 ) goto :EOF :check_date if "%_dd%"=="" FOR /F " usebackq tokens=1,2,3,4,* delims=./" %%a IN (`echo %date%`) DO ( if /I "%_oslanguage%"=="de" ( set _dd=%%a ) ELSE ( set _dd=%%b ) ) if %_dd% EQU 0 FOR /F " usebackq tokens=1,2,3,4,* delims=./" %%a IN (`echo %date%`) DO ( if /I "%_oslanguage%"=="de" ( set _dd=%%a ) ELSE ( set _dd=%%b ) ) if "%_mm%"=="" FOR /F " usebackq tokens=1,2,3,4,* delims=./" %%a IN (`echo %date%`) DO ( if /I "%_oslanguage%"=="de" ( set _mm=%%b ) ELSE ( set _mm=%%a ) ) if %_mm% EQU 0 FOR /F " usebackq tokens=1,2,3,4,* delims=./" %%a IN (`echo %date%`) DO ( if /I "%_oslanguage%"=="de" ( set _mm=%%b ) ELSE ( set _mm=%%a ) ) if "%_yyyy%"=="" FOR /F " usebackq tokens=1,2,3,4,* delims=./" %%a IN (`echo %date%`) DO set _yyyy=%%c rem delete 0 as prefix set _yyyy=x0%_yyyy% set _yyyy=%_yyyy:x0=x% set _yyyy=%_yyyy:x0=x% set _yyyy=%_yyyy:x0=x% set _yyyy=%_yyyy:x=% if "%_yyyy%" == "" set _yyyy=0 if %_yyyy% LEQ 30 ( if %_yyyy% LEQ 9 ( set _yyyy=200%_yyyy% ) ELSE ( set _yyyy=20%_yyyy% ) ) ELSE ( if %_yyyy% LEQ 99 set _yyyy=19%_yyyy% ) goto :EOF :display echo. if /I "%_language_output%"=="de" ( echo Der %_dd%.%_mm%.%_cent%%_yy% ist ein %_www% ^(%_w%=%_ww%^) echo %_dayofyear%. Tag des Jahres in der KW %_cwy% if %_leapyear% EQU 1 ( echo Das Jahr %_yyyy% ist ein Schaltjahr ) ELSE ( echo Das Jahr %_yyyy% ist kein Schaltjahr ) ) ELSE ( echo The %_mm%/%_dd%/%_cent%%_yy% is a %_www% ^(%_w%=%_ww%^) echo %_dayofyear%. day of the year, calender week %_cwy% if %_leapyear% EQU 1 ( echo The Year %_yyyy% is a leap year ) ELSE ( echo The Year %_yyyy% is no leap year ) ) echo. goto :EOF :def_leapyear setlocal set _leapyear=0 set /a _l0=%_yyyy% / 4 set /a _l1=%_yyyy% - (%_l0% * 4) set /a _l0=%_yyyy% / 100 set /a _l2=%_yyyy% - (%_l0% * 100) set /a _l0=%_yyyy% / 400 set /a _l3=%_yyyy% - (%_l0% * 400) if %_l1% EQU 0 set _leapyear=1 if %_leapyear% EQU 1 if %_l2% EQU 0 set _leapyear=0 if %_l3% EQU 0 set _leapyear=1 endlocal & set _leapyear=%_leapyear% goto :EOF :def_daysb4 REM daysb4 = days before (Anzahl der Tage die in den vorherigen Monaten waren) if %_m% EQU 1 set _daysb4=0 if %_m% EQU 2 set _daysb4=31 if %_m% EQU 3 set /a _daysb4=31+28+%_leapyear% if %_m% EQU 4 set /a _daysb4=31+28+31+%_leapyear% if %_m% EQU 5 set /a _daysb4=31+28+31+30+%_leapyear% if %_m% EQU 6 set /a _daysb4=31+28+31+30+31+%_leapyear% if %_m% EQU 7 set /a _daysb4=31+28+31+30+31+30+%_leapyear% if %_m% EQU 8 set /a _daysb4=31+28+31+30+31+30+31+%_leapyear% if %_m% EQU 9 set /a _daysb4=31+28+31+30+31+30+31+31+%_leapyear% if %_m% EQU 10 set /a _daysb4=31+28+31+30+31+30+31+31+30+%_leapyear% if %_m% EQU 11 set /a _daysb4=31+28+31+30+31+30+31+31+30+31+%_leapyear% if %_m% EQU 12 set /a _daysb4=31+28+31+30+31+30+31+31+30+31+30+%_leapyear% set /a _dayofyear=%_d% + %_daysb4% goto :EOF :def_cwy REM cw = calender week (Kalenderwoche) setlocal set _wx=%_w% set _mm=1 set _dd=4 call :set_month_value call :set_year_value call :calc_weekday set /a _last_monday=%_wx% - 1 set /a _cw=((7 + 3 - %_last_monday% + (%_dayofyear% - 1) ) / 7 ) if %_cw% EQU 0 set /a _yyyy=%_yyyy%-1 if %_cw% EQU 0 call :def_leapyear if %_cw% EQU 0 set /a _cw=((365 + %_leapyear% + 7 + 3 - %_last_monday% + (%_dayofyear% - 1) ) / 7 ) endlocal & set _cw=%_cw%& set _cwy=%_cw%/%_yyyy% REM if Calender week is 53 check if the day is in the first week of the new year REM Rule: Begin or end the year with a Thursday the year have 53 weeks Rem cwoy = calender weeks of year Rem cwny = calender week new year if %_cw% EQU 53 ( set _cwoy=53 ) ELSE ( set _cwoy=52 ) if %_cwoy% EQU 53 call :check_if_year_begin_with_thu if %_cw% EQU 53 if %_cwoy% EQU 52 call :calc_new_cwy goto :EOF :calc_new_cwy set _cw=1 set /a _cwny=%_yyyy%+1 set _cwy=%_cw%/%_cwny% goto :EOF :check_if_year_begin_with_thu REM check if year begins with a Thursday setlocal set _mm=1 set _dd=1 call :set_month_value call :set_year_value call :calc_weekday if not %_w% EQU 4 call :check_if_year_ends_with_thu endlocal & set _cwoy=%_cwoy% goto :EOF :check_if_year_ends_with_thu REM check if year ends with a Thursday setlocal set _mm=12 set _dd=31 call :set_month_value call :set_year_value call :calc_weekday if not %_w% EQU 4 set _cwoy=52 endlocal & set _cwoy=%_cwoy% goto :EOF REM ############################################################################ :help set _helpfile=%_thisfile%.help.txt echo. > %_helpfile% || set _helpfile=%tmp%\%_thisfile%.help.txt echo. > %_helpfile% || set _helpfile=^^^&2 echo Help: %_thisfile% >> %_helpfile% echo created by Mark Wolfgruber (600infos.de) >> %_helpfile% echo i advice to copy the script to "%ProgramFiles%\scripts\date\" >> %_helpfile% echo or better to your systempath e.g. in %%SystemRoot%%="%SystemRoot%\" >> %_helpfile% echo. >> %_helpfile% echo calculates the day of a week, calender week, leap year, day of year >> %_helpfile% echo and export this into set enviroment variables >> %_helpfile% echo Weekdays are 1=Monday, 7=Sunday >> %_helpfile% echo You can use the german (dd.mm.yyyy) or english (mm/dd/yyyy) date format >> %_helpfile% echo the year >> %_helpfile% echo. >> %_helpfile% echo FORMAT: %_thisfile% [Date] >> %_helpfile% echo starting without option the script will ask for a date >> %_helpfile% echo. >> %_helpfile% echo this Help: %_thisfile% /help >> %_helpfile% echo. >> %_helpfile% echo INFO: >> %_helpfile% echo (i'm searching for a good translation) >> %_helpfile% echo zweistellige Jahreszahlen 31-99 werden als 1931-1999 interprediert >> %_helpfile% echo ein- bzw. zweistellige Jahreszahlen 0-30 werden als 2000-2030 interprediert >> %_helpfile% echo wird keine Jahreszahl angegeben wird das aktuelle Jahr verwendet >> %_helpfile% echo wird kein Monat oder 0 angegeben wird das aktuelle Monat verwendet >> %_helpfile% echo wird kein Tag oder 0 angegeben wird der aktuelle Tag verwendet >> %_helpfile% echo wird nur 0 angegeben wird das aktuelle Datum verwendet >> %_helpfile% echo z.Zt. findet keine Prüfung auf unplausible Tage statt >> %_helpfile% echo. >> %_helpfile% echo Beispiele/Examples: >> %_helpfile% echo 1. des Monats: %_thisfile% 1. >> %_helpfile% echo 1st of the Month: %_thisfile% 0/1 >> %_helpfile% echo Heute/Today: %_thisfile% %%date%% >> %_helpfile% echo or %_thisfile% 0 >> %_helpfile% echo. >> %_helpfile% echo Output in SET Variables: >> %_helpfile% echo _cw=12 >> %_helpfile% echo _cww=12 >> %_helpfile% echo _cwwy=12/2009 >> %_helpfile% echo _cwy=12/2009 >> %_helpfile% echo _d=17 >> %_helpfile% echo _date=2009-03-17 >> %_helpfile% echo _dayofyear=76 >> %_helpfile% echo _dd=17 >> %_helpfile% echo _language_output=de >> %_helpfile% echo _leapyear=0 >> %_helpfile% echo _longdate=Dienstag, 17.03.09 >> %_helpfile% echo _m=3 >> %_helpfile% echo _mm=03 >> %_helpfile% echo _w=2 >> %_helpfile% echo _ww=Di >> %_helpfile% echo _www=Dienstag >> %_helpfile% echo _yy=09 >> %_helpfile% echo _yyyy=2009 >> %_helpfile% echo. >> %_helpfile% echo this helpfile: %_helpfile% >> %_helpfile% if not "%_helpfile%"=="^&2" if exist %_helpfile% more %_helpfile% endlocal goto end :clear_vars endlocal set _cw= set _cww= set _cwy= set _cwwy= set _d= set _date= set _dayofyear= set _dd= set _language_output= set _leapyear= set _longdate= set _m= set _mm= set _w= set _ww= set _www= set _yy= set _yyyy= goto end :end REM END OF FILE REM EXIT 0 rem pause