![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-08 20:15 |
共 47,811 主题排行 / 349,895 发帖 / 今日 0 篇 / 48,253 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [原创]********简单万年历******** |
| 可打印版本 2,349 / 17 |
| 第1楼 s11ss | 发表于 2007-09-29 16:01 |
| 银牌会员 发帖 566 积分 2,098 | |
|
[原创]********简单万年历******** |
|
| 第2楼 knoppix7 | 发表于 2007-09-29 17:30 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
我也写过一个~~~~~~~~~~~~~
@echo off setlocal enabledelayedexpansion :{ ://处理月数 set Y=%date:~0,4% set M=%date:~5,2% set D=%date:~8,2% if %M:~0,1%==0 set M=%M:~1,1% if %D:~0,1%==0 set D=%D:~1,1% FOR %%i IN (4 400) DO ( set /a T1=%y%%%%%i if !T1!==0 (set runnian=1) ELSE set runnian=0 ) call :checkmouth %runnian% set T1=%Y:~0,2% set T2=%Y:~2,2% if %T2:~0,1%==0 set T2=%T2:~1,1% set /a T1=%T1%%%4 set /a T1=T1/-2+5 set /a T2=((%T2%-%t2%%%4)/4+%T2%)%%7 call :yueyushu set /a T4=(%T1%+%T2%+%T3%+1)%%7 rem T4=星期数,0=>日 1=>一 .... set T1=&set T2=&set T3=&set Y= :} :{ ://显示准备 call :setdateend %M% set /a dateend=%dateend%+%T4%-1 set T1=1 for /L %%i IN (0,1,38) DO ( if %%i GEQ %T4% IF %%i LEQ %dateend% ( if !T1! LEQ 9 (set W%%i= !T1! ) ELSE set W%%i=!T1! if !T1! EQU %D% set W%%i=!T1!* call set T5=%%js9!T1!%% if NOT "!T5!"=="" ( if !T1! LEQ 9 (set W%%i= !T1!$) ELSE set W%%i=!T1!$ if !T1! EQU %D% ( if !T1! LEQ 9 (set W%%i= !T1!#) ELSE set W%%i=!T1!# ) ) set /a T1=!T1!+1 ) if %%i LSS %T4% set "W%%i= " if %%i GTR %dateend% set "W%%i= " ) set T1= echo 今天是:%date% echo 日 一 二 三 四 五 六 echo %W0% %W1% %W2% %W3% %W4% %W5% %W6% echo %W7% %W8% %W9% %W10% %W11% %W12% %W13% echo %W14% %W15% %W16% %W17% %W18% %W19% %W20% echo %W21% %W22% %W23% %W24% %W25% %W26% %W27% echo %W28% %W29% %W30% %W31% %W32% %W33% %W34% echo %W35% %W36% %W37% %W38% GOTO :EOF :} :{ ://子区块部分 :setdateend for %%i IN (1 3 5 7 8 10 12) DO ( if %1==%%i (set dateend=31) ELSE set dateend=30 ) if %1==2 ( If %runnian%==1 (set dateend=29) ELSE set dateend=28 ) GOTO :EOF :yueyushu set T3=!%m%y! goto :EOF :checkmouth if %1==0 ( set 1y=1 set 2y=4 ) ELSE ( set 1y=0 set 2y=3 ) set 3y=4 set 4y=0 set 5y=2 set 6y=5 set 7y=0 set 8y=3 set 9y=6 set 10y=1 set 11y=4 set 12y=8 GOTO :EOF :} |
|
| 第3楼 wudixin96 | 发表于 2007-09-29 17:32 |
| 银牌会员 发帖 931 积分 1,928 | |
|
高手对决啊,激出火花
|
|
| 第4楼 knoppix7 | 发表于 2007-09-29 17:55 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
可惜他的方法比我的简单多了~~
|
|
| 第5楼 s11ss | 发表于 2007-09-29 23:01 |
| 银牌会员 发帖 566 积分 2,098 | |
Originally posted by knoppix7 at 2007-9-29 05:55 PM: knoppix7,你的闰年判断好像有问题啊. 你的意思是能被400整除的才是闰年? 可以用2004-2-29来测试一下.........2004显然是闰年 |
|
| 第6楼 lipu721 | 发表于 2007-09-29 23:50 |
| 新手上路 发帖 2 积分 4 | |
|
头晕晕的............
|
|
| 第7楼 lipu721 | 发表于 2007-09-29 23:50 |
| 新手上路 发帖 2 积分 4 | |
|
看了就头晕,太多了。我晕
|
|
| 第8楼 knoppix7 | 发表于 2007-09-30 12:36 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
被4或400整除才是.
明白了.计算程序错了... 要把 FOR %%i IN (4 400) DO ( set /a T1=%y%%%%%i if !T1!==0 (set runnian=1) ELSE set runnian=0 ) 修改成 set runnian=0 FOR %%i IN (4 400) DO ( set /a T1=%y%%%%%i if !T1!==0 (set runnian=1) ) [ Last edited by knoppix7 on 2007-9-30 at 04:45 PM ] |
|
| 第9楼 knoppix7 | 发表于 2007-09-30 16:46 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
作为DEBUG的回报。加4点吧.
|
|
| 第10楼 s11ss | 发表于 2007-09-30 17:23 |
| 银牌会员 发帖 566 积分 2,098 | |
|
knoppix7,
你判断闰年的算法有问题.对于闰年的判断我过去也一直是一头雾水。 能被4或400整除的是闰年,这句话就相当于说能被4整除的是闰年,因为一个数能被400整除是这个数能被4整除的充分条件。 就好比说: 大眼睛的或大眼睛长头发的女人是美女。其实就是说大眼睛的女人是美女。 正确的算法应该是: 能被4整除,且不能被100整除的是闰年;或者能被400整除的是闰年。 比如2100年按你的算法是闰年,但其实不是,因为它上面两个条件都不满足。 但其实能被3200整除的不是闰年,不过这离现在太远了。一般就是按上面的算法判断闰年的。 关于闰年的判断早在几年前学C语言的时候我就没弄明白,最近写这个万年历的时候才总算彻底搞懂了。 |
|
| 第11楼 slore | 发表于 2007-09-30 17:31 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
其实能被3200整除的不是闰年……这个说法太……不要说的让人产生反面是闰年的说法……
能被4整除,且不能被100整除的是闰年;或者能被400整除的是闰年。 这个是对的。 原因: 阳历究竟哪一年算是闰年,只要做一次简单的计算就知道,用4去除阳历的年份,除尽的就是闰年,象1964年、1968年等等都是闰年,这几年的二月都有29天。 又因为阳历一年的确实天数应该是365天5小时48分46秒,比常年365天多出5小时48分46秒,四年一共只多出23小时15分4秒。每4年一闰加一天的话,又多加了44分56秒,400年差不多就会多加出3天来,所以,每400年得扣去3天才行,于是,又定了一一条补充规定:每逢阳历年份是整白的那一年,比如公元l800年、1900年、2000年等,能被400除尽的才算是闰年。这样公元1800年和1900年尽管能被4除尽,但是不能被400除尽,所以不算是闰年,而公元2000年才是闰年,它的二月才有29天。有了这样一条补充规定,每四百年就可以从中扣去那多加出来的3天了。虽然这样调整以后,也还会有微小的误差,但要经过3000年后才会差一天,我们日常应用就算很准确了。 |
|
| 第12楼 knoppix7 | 发表于 2007-09-30 17:59 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
Originally posted by s11ss at 2007-9-30 05:23 PM: 对不起。具体方法我是copy网上的.不过。我发现WXP的时间根本到不了2100年。 所以没算进去. |
|
| 第13楼 knoppix7 | 发表于 2007-09-30 18:04 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
Originally posted by slore at 2007-9-30 05:31 PM: 哪计算方法是什么。。。。。 又不可能人工指定时间... |
|
| 第14楼 knoppix7 | 发表于 2007-09-30 18:07 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
我想到了。
用date命令判断。 事例: C:\Documents and Settings\lenovo>date 2007-02-29(非闰年,所以...) 系统无法接受输入的日期。 输入新日期: (年月日) C:\Documents and Settings\lenovo>date 2100-02-29(超过WXP的年数限制) 系统无法接受输入的日期。 输入新日期: (年月日) C:\Documents and Settings\lenovo>date 2004-02-29(成功) [ Last edited by knoppix7 on 2007-10-1 at 02:11 PM ] |
|
| 第15楼 knoppix7 | 发表于 2007-10-01 14:13 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
我想到的办法:
@echo off set DD=%date:~0,10% set runnian=0 date %y%-2-29|find "系统无法接受输入的日期。" >nul ||set runnian=1 date %DD% 不过我没有测试... |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |