| :: 月历查询工具 最初发表于CN-DOS |
| :: 原创:foxjl 更新:namejm, qzwqzw,foxjl |
| :: 宽度修改:SAMPECK 2009-06-26 |
| :: 计算农历日期部分思路及算法来自"趣味东" |
| :: 输入的日期格式为:年-月-日(-可以替换为:、/,可以混用) |
| :: 在日历里面,★=当天 |
| :: 支持多种格式的日期输入: |
| :: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上; |
| :: ② 若输入两个数,则认为是查询年和月,★标在1日上; |
| :: ③ 输全的话,★标在指定日期上 |
| :: 关于年份的转换: |
| :: ① 若年份上输入的数字少于三位,则作如下转换: |
| :: 50~99判定为19xx |
| :: 0~49判定为20xx |
| :: ② 若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0), |
| :: 按 ① 的规则计算该年份的日期; |
| :: 07-08-04 增加针对农历的生肖及干支年计算;修改错误日期循环提示的BUG. |
| :: 08-01-13 增加推算农历日期的功能. |
| @echo off |
| color 1f |
| mode con cols=42 lines=20 |
| setlocal enabledelayedexpansion |
| set str=日一二三四五六七八九 |
| set sdate=%date% |
| :Main |
| cls&echo. |
| :: 日期提取、格式化与校验 |
| for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do ( |
| (set sy=%%i) && (set sm=%%j) && (set sd=%%k) |
| ) |
| if not defined sd set sd=1 |
| if not defined sm set sm=%sy%&set sy=%date:~0,4% |
| (set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%) |
| (set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%) |
| set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul |
| if errorlevel 9167 goto Error |
| if %y% lss 100 ( |
| if %y% lss 50 (set /a y+=2000) else (set /a y+=1900) |
| set sy=!y! |
| ) |
| if %m% lss 13 if %d% lss 32 goto Calc |
| :Error |
| echo.错误的日期. |
| pause>nul |
| cd. |
| set sdate=%date% |
| goto Main |
| :Calc |
| ::计算农历部分 |
| set/a Q=(y-1901)/4 |
| set/a R=y-1901-4*Q |
| set n=0 |
| for %%i in (0,31,59,90,120,151,181,212,243,273,304,334) do ( |
| set /a n+=1 |
| if %m% equ !n! set z=%%i) |
| set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)" |
| if %m% gtr 2 (if %leap% equ 0 (set /a z-=1) else (set /a z+=leap)) |
| set/a n=(140*Q+106*(R+1)+z*10+d*10)/295,H=(140*Q+106*(R+1)+z*10+d*10-295*n)/10 |
| if %h% equ 0 set h=29 |
| if %h% leq 10 (if %h% equ 10 (set h=初十) else (set h=初%h%)) else (set h=%h:~0,1%十%h:~-1%号) |
| for /l %%i in (1,1,9) do (call set h=%%h:%%i=!str:~%%i,1!%%) |
| set h=%h:0=% |
| :: 计算生肖及干支年 |
| set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊 |
| set tg=庚辛壬癸甲乙丙丁戊己 |
| set dz=申酉戌亥子丑寅卯辰巳午未 |
| set /a sxnum=%sy% %% 12 |
| set /a tgnum=%sy:~-1% |
| title 农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1! 农历:%h% |
| :: 计算每个月的天数 |
| set days=31 |
| for %%i in (4 6 9 11) do if %m% equ %%i set days=30 |
| :: 计算2月份的偏差 |
| set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)" |
| if %m% equ 2 set /a days=28+%leap% |
| if %m% leq 2 (set /a y-=1& set /a m+=12) |
| :: 计算指定日期的星期数 |
| set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7 |
| echo. %sy%年%sm%月 日期:%sy%-%sm%-%sd%,星期!str:~%w%,1! |
| echo. |
| :: 生成月历 |
| set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1 |
| echo. 日 一 二 三 四 五 六 |
| echo. ━━━━━━━━━━━━━━━━━━━ |
| set /p= <nul |
| for /l %%i in (0,1,37) do ( |
| set "temp= " |
| if %%i GTR %wb% if %%i LSS %we% ( |
| set temp= !day! |
| set temp=!temp:~-2! |
| if !d! EQU !day! set temp=★ |
| set /a day+=1 |
| ) |
| set /p= !temp!<nul |
| set /a "wm=(%%i+1)%%7" |
| if !wm! equ 0 echo.&echo.&set /p= <nul |
| ) |
| echo. |
| echo ━━━━━━━━━━━━━━━━━━━ |
| echo. 输入日期可查询当日星期并显示当月月历 |
| echo. |
| set sdate= |
| set /p sdate= 格式如:2009-06-26,[回车]退出: |
| if defined sdate goto MainCOPY |