Hier ein Commando - Script ( DOS - Batch ) welches den Wochentag eines beliebigen Datums bestimmt...
weekday.cmd kann den eigenen Bedürfnissen angepasst werden und übergibt die Parameter als SET Variablen
Für die Suchmaschinen: Commando, Script, cmd, Windows, DOS, Batch, bat, Wochentag, beliebiges Datum bestimmen, berechnen
Zuvor noch ein kleines Script zum testen:
@echo off
setlocal ENABLEDELAYEDEXPANSION enableextensions
for /l %%a in (0,1,99) do (
call weekday.cmd 31.12.%%a
echo !_date! !_ww! !_cwwy!
)
CODE: weekday.cmd
@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




