标题: [原创]批处理版万年历(不断完善中)
[打印本页]
作者: bat-zw
时间: 2008-4-7 00:48
标题: [原创]批处理版万年历(不断完善中)
注:查询年月从1904年01月起,因农历无法用程序进行计算,因此暂无农历显示,本人将继续完善。
-----------------------------------
四楼为加强版
-----------------------------------
十五楼为最终修正版(更新日期2008年4月20日)
附件exe版:
http://upload.cn-dos.net/img/248.rar@echo off&color 9f&mode con lines=20
title 批处理版万年历
:begin
cls
echo.&echo.&echo.&echo.&echo.
set var=&set str=&set str1=&set str2=&set str3=&set n=0&set m=0&set v=0&set w=0
set /p var=请输入要查询的月份(格式为2000年08月):
if "%var:~4,1%%var:~7,1%"=="年月" goto year
cls
echo.&echo.&echo.&echo.&echo.
echo 输入格式不正确!请返回正确输入。&ping /n 3 127.1>nul&goto begin
:year
set year=%var:~,4%
set /a str=(%year%-1904)/4&set /a str1=%year%-1904
set /a a=%str1%-%str%*4
set str1=
:month
if %a% equ 0 (set /a number1=%str%*1461) else (set /a number1=%str%*1461+%a%*365+1)
if %var:~5,1% equ 0 (set month=%var:~6,1%) else (set month=%var:~5,2%)
if %month% equ 2 set n=28
if %a% equ 0 set n=29
for %%i in (1,3,5,7,8,10,12) do if "%%i"=="%month%" set n=31
for %%i in (4,6,9,11) do if "%%i"=="%month%" set n=30
set /a month=%month%-1
if %month% equ 0 set /a number2=0
if %month% equ 1 set /a number2=31
if %month% equ 2 set /a number2=31+28
if %month% equ 3 set /a number2=31*2+28
if %month% equ 4 set /a number2=31*2+30+28
if %month% equ 5 set /a number2=31*3+30+28
if %month% equ 6 set /a number2=31*3+30*2+28
if %month% equ 7 set /a number2=31*4+30*2+28
if %month% equ 8 set /a number2=31*5+30*2+28
if %month% equ 9 set /a number2=31*5+30*3+28
if %month% equ 10 set /a number2=31*6+30*3+28
if %month% equ 11 set /a number2=31*6+30*4+28
if %a% equ 0 set /a number2=%number2%+1
if %month% lss 2 set /a number2=%number2%-1
:day
cls
echo.&echo.&echo.&echo.&echo.
echo [************************%var%**********************]
echo.
for /l %%i in (1,1,%n%) do (
set day=%%i
call :week %%day%%
)
echo.&echo 本次查询完成,继续查询请按任意键,退出请关闭窗口。
pause>nul&goto begin
:week
set /a w+=1
set /a number=%number1%+%number2%+%1-1
set /a week=%number%/7
set /a b=%number%-%week%*7
set day=%day%日
call,set day=%day: =%
if not "%day:~2,1%"=="日" set day= %day%
set code=五六天一二三四
call,set code=星期%%code:~%b%,1%%
set str1=%str1% %day%
set str2=%str2% %code%
set /a v+=1&set /a m+=1
if %v% gtr 7 set str2=--------------------------------------------------------
if %m% gtr 6 set m=0&echo ^|%str2%^|&echo ^|%str1%^|&set str1=&set str2=
if %w% gtr 28 set str3=%str3% %day%
if %w% equ %n% echo ^|%str2%^|&echo ^|%str3%&echo ^|%str2%^|
goto :eof
[
Last edited by zw19750516 on 2008-4-20 at 09:40 AM ]
作者: terse
时间: 2008-4-7 01:10
农历的数据 曾经贴过
http://www.cn-dos.net/forum/view ... ;highlight=%2Bterse
作者: HAT
时间: 2008-4-7 06:23
不是有高人发帖说过吗?农历是天文学家根据历法推算出来的,没有现成的程序算法。就用2楼给的数据吧。
作者: bat-zw
时间: 2008-4-7 23:16
标题: 再次加强(加入本月本日显示):
再加入窗口颜色变化并加入注解:
@echo off&mode con cols=65 lines=20
rem: 设置窗口标题
title 批处理版万年历
:begin
rem: 设置窗口随机颜色
set /a P=%random%%%15
if %p% equ 10 set p=a
if %p% equ 11 set p=b
if %p% equ 12 set p=c
if %p% equ 13 set p=d
if %p% equ 14 set p=e
color %p%f
cls
echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.
rem: 清空置0
set var=&set str=&set str1=&set str2=&set str3=&set n=0&set m=0&set v=0&set w=0
rem: 提取系统当日日期参数
set var=%date:~,4%年%date:~5,2%月
set /p var=输入要查询的月份(格式为2000年08月默认回车为本月):
rem: 判断输入格式
if "%var:~4,1%%var:~7,1%"=="年月" goto year
cls
echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.
echo 输入格式不正确!请返回正确输入。&ping /n 2 127.1>nul&goto begin
:year
rem: 提取输入的年份参数
set year=%var:~,4%
rem: 以四年为周期计算年余数
set /a str=(%year%-1904)/4&set /a str1=%year%-1904
set /a a=%str1%-%str%*4
set str1=
rem: 计算整年天数
if %a% equ 0 (set /a number1=%str%*1461) else (set /a number1=%str%*1461+%a%*365+1)
:month
rem: 提取输入的月份参数
if %var:~5,1% equ 0 (set month=%var:~6,1%) else (set month=%var:~5,2%)
rem: 计算输入月份的天数
if %month% equ 2 set n=28
if %a% equ 0 set n=29
for %%i in (1,3,5,7,8,10,12) do if "%%i"=="%month%" set n=31
for %%i in (4,6,9,11) do if "%%i"=="%month%" set n=30
set /a month=%month%-1
rem: 计算整月天数
if %month% equ 0 set /a number2=0
if %month% equ 1 set /a number2=31
if %month% equ 2 set /a number2=31+28
if %month% equ 3 set /a number2=31*2+28
if %month% equ 4 set /a number2=31*2+30+28
if %month% equ 5 set /a number2=31*3+30+28
if %month% equ 6 set /a number2=31*3+30*2+28
if %month% equ 7 set /a number2=31*4+30*2+28
if %month% equ 8 set /a number2=31*5+30*2+28
if %month% equ 9 set /a number2=31*5+30*3+28
if %month% equ 10 set /a number2=31*6+30*3+28
if %month% equ 11 set /a number2=31*6+30*4+28
if %a% equ 0 set /a number2=%number2%+1
if %month% lss 2 set /a number2=%number2%-1
set str=
:day
cls
echo.&echo.&echo.&echo.&echo.
echo [***********************%var%***********************]
echo.
rem: 以当月天数为循环
for /l %%i in (1,1,%n%) do (
set day=%%i
call :week %%day%%
)
echo.&echo 本次查询完成,继续查询请按任意键,退出请关闭窗口。
pause>nul&goto begin
:week
set /a v+=1&set /a m+=1
rem: 计算总天数
set /a number=%number1%+%number2%+%1-1
rem: 计算总星期数
set /a week=%number%/7
rem: 计算星期的余数
set /a b=%number%-%week%*7
if %day% lss 10 (set today=0%day%) else (set today=%day%)
set day=%day%日
call,set day=%day: =%
if not "%day:~2,1%"=="日" set day= %day%
rem: 判断如是本月刚将本日显示为五角星
if "%var:~,4%%var:~5,2%%today:~,2%"=="%date:~,4%%date:~5,2%%date:~8,2%" set day= ★
rem: 根据星期余数推算为星期几
set code=五六天一二三四
call,set code=星期%%code:~%b%,1%%
rem: 变量累加(不输出)
set str=%str% %day%
set str1=%str1% %code%
rem: 设置输出条件并及时清空变量
if %v% gtr 7 set str1= [--------------------------------------------------------]
if %m% equ 7 set m=0&echo %str1%&echo %str%&set str=&set str1=
if %v% gtr 28 set str2=%str2% %day%
if %v% equ %n% echo %str1%&echo %str2%&echo %str1%&set str1=&set str2=
goto :eof
[
Last edited by zw19750516 on 2008-4-8 at 06:34 PM ]
作者: abcd
时间: 2008-4-7 23:21
Quote: |
'--]' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'--]' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'--]' 不是内部或外部命令,也不是可运行的程序
或批处理文件。 |
|
直接回车
作者: abcd
时间: 2008-4-7 23:23
输入格式太不灵活了
建议多几种输入格式吧
作者: plp626
时间: 2008-4-7 23:42
不管怎样,我鼓励楼主发帖,
代码有不少地方需要改进,楼主继续,我给你加分
作者: xb2008chopin
时间: 2008-4-8 03:11
真的不错 新手我 学习了!
作者: bat-zw
时间: 2008-4-8 09:06
标题: 继续完善中:
就是工作太忙,没太多时间,但我会把它继续完善的。
作者: BWSkyer
时间: 2008-4-8 10:19
后面一个加强的,输入月份后查询不了, 代码我现在还有部分都看不懂
作者: bat-zw
时间: 2008-4-8 13:18
Quote: |
Originally posted by BWSkyer at 2008-4-8 10:19:
后面一个加强的,输入月份后查询不了, 代码我现在还有部分都看不懂 |
|
输入格式为****年0*月,只输入*月是不行的,不会被认定为正确输入。
作者: bat-zw
时间: 2008-4-8 13:18
Quote: |
Originally posted by abcd at 2008-4-7 23:23:
输入格式太不灵活了
建议多几种输入格式吧 |
|
这样输入是为了计算中的认定的,随意输入将会导致计算过程出错。
作者: BWSkyer
时间: 2008-4-8 13:23
我是这样输入的哦~~~~
作者: bat-zw
时间: 2008-4-8 13:55
Quote: |
Originally posted by BWSkyer at 2008-4-8 13:23:
我是这样输入的哦~~~~ |
|
满10位前面就不要加0了。
不知兄弟哪段看不懂,我可以解释下。
[
Last edited by zw19750516 on 2008-4-8 at 02:02 PM ]
作者: bat-zw
时间: 2008-4-9 01:36
标题: 根据日常习惯再次修改(星期天显示在前):
-----------------------------------
继续修正了闰年月计算的错误以及当月1号为星期天首行排版不齐的问题,同时去除与亮白色字体不协调的窗口颜色。
-----------------------------------
于2008年4月20日再次简化代码和提高输入灵活性。
@@echo off&color 4f&mode con cols=65 lines=22
title 批处理版万年历
:begin
set /a P=%random%%%14
for %%i in (6,7,10,11,12) do if %%i equ %p% goto begin
if %p% equ 13 set p=d
color %p%f
cls
echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.
set var=&set str=&set str1=&set n=0&set m=0&set number2=0
set var=%date:~,7%
set /p var=输入要查询的月份(格式为2000-08默认回车为本月):
set /a month=100%var:~5%%%100
if "%var:~4,1%"=="-" if %month% leq 12 goto year
cls
echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.
echo 输入格式不正确!请返回正确输入。&ping /n 2 127.1>nul&goto begin
:year
set year=%var:~,4%
set /a str=(%year%-1904)/4,a=(%year%-1904)%%4
:month
if %a% equ 0 (set /a number1=%str%*1461) else (set /a number1=%str%*1461+%a%*365+1)
if %month% equ 2 (
if %a% equ 0 (
set n=29
) else (
set n=28
)
)
for %%i in (1,3,5,7,8,10,12) do if %%i equ %month% set n=31
for %%i in (4,6,9,11) do if %%i equ %month% set n=30
set /a month-=1
if %month% gtr 0 for /l %%a in (1,1,%month%) do call :loop %%a
if %month% gtr 2 (
if %a% equ 0 (
set /a number2+=29
) else (
set /a number2+=28
)
)
set str=
set /a month+=1
if %month% lss 10 set month=0%month%
:day
cls
echo.&echo.&echo.&echo.&echo.
echo [***********************%year%年%month%月***********************]
set list=星期天 星期一 星期二 星期三 星期四 星期五 星期六
echo.
echo %list%
for /l %%i in (1,1,37) do (
set day=%%i
call :week %%day%%
)
echo.&echo 本次查询完成,继续查询请按任意键,退出请关闭窗口。
pause>nul&goto begin
:week
set /a m+=1 ,number=%number1%+%number2%+%1-1
set /a b=%number%%%7
if %day% lss 10 (set today=0%day%) else (set today=%day%)
set day=%day%日
call,set day=%day: =%
if not "%day:~2,1%"=="日" set day= %day%
if "%var:~,4%%var:~5,2%%today:~,2%"=="%date:~,4%%date:~5,2%%date:~8,2%" set day= ★
set code=五六天一二三四
call,set code=星期%%code:~%b%,1%%
set /a c=%b%+5
if %c% gtr 7 set /a c-=7
set str=%str% %day%
if %m% lss 2 for /l %%i in (1,1,%c%) do call :lp
set str1=[--------------------------------------------------------]
if %m% lss %n% if "%code%"=="星期六" echo %str1%&echo %str%&set str=
if %m% equ %n% echo %str1%&echo %str%&echo %str1%&set str=
goto :eof
:loop
for %%i in (1,3,5,7,8,10) do if %%i equ %1 set /a number2+=31
for %%i in (4,6,9,11) do if %%i equ %1 set /a number2+=30
goto :eof
:lp
if not "%code%"=="星期天" set str= %str%
[
Last edited by zw19750516 on 2008-4-20 at 09:21 AM ]
作者: bat-zw
时间: 2008-4-9 21:12
标题: 还请大家帮着多测试下:
为了本批处理的完善,还请大家都帮着测试下了,先谢过各位了!
作者: movy
时间: 2008-4-10 20:33
支持创新,农历如何加入啊?
关注一下~
作者: rzwwj1
时间: 2008-4-20 06:34
好,就是直接输入年月不行,能直接输入200706直接查询就好了,省下输入汉字了。
作者: bat-zw
时间: 2008-4-20 09:38
标题: 再一次更新:
已在15楼按楼上的要求更新。