中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-09 00:19
47,811 主题排行 / 349,895 发帖 / 今日 0 篇 / 48,253 会员排行
DOS批处理 & 脚本技术(批处理室) » [原创]********简单万年历********
可打印版本  2,364 / 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:
knoppix7,
你判断闰年的算法有问题.对于闰年的判断我过去也一直是一头雾水。

能被4或400整除的是闰年,这句话就相当于说能被4整除的是闰年,因为 ...


对不起。具体方法我是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:
其实能被3200整除的不是闰年……这个说法太……不要说的让人产生反面是闰年的说法……

能被4整除,且不能被100整除的是闰年;或者能被400整除的 ...



哪计算方法是什么。。。。。
又不可能人工指定时间...
第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