中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-15 13:03
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » [挑战5]:日期的前后时间计算 [难度:☆☆]
可打印版本  5,307 / 27
第16楼 slore 发表于 2007-05-02 17:52
铂金会员 发帖 2,478 积分 5,212
我有个思路就是求余...除365 余数Y1再先对4求余(闰年)看有几个闰年给Y1要再减几个1,得到Y2

然后Y2化成月和日即可。。。
(哈哈,还是execute够偷懒)
第17楼 flyinspace 发表于 2007-05-02 18:10
银牌会员 发帖 517 积分 1,206
噢。仔细看了一下。确实考虑到了闰年。。

原理研究中?
第18楼 flyinspace 发表于 2007-05-02 18:24
银牌会员 发帖 517 积分 1,206
Originally posted by slore at 2007-5-2 04:52 AM:
我有个思路就是求余...除365 余数Y1再先对4求余(闰年)看有几个闰年给Y1要再减几个1,得到Y2

然后Y2化成月和日即可。。。
(哈哈,还是execute够偷懒)


现在不管你偷懒与否。。。

给出大家所需要的代码出来吧。。

这一点上,无论如何请不要偷懒了。
第19楼 slore 发表于 2007-05-02 18:28
铂金会员 发帖 2,478 积分 5,212
晕死,好像叫新建 脚本文件.vbs

貌似删除了。。那重写看看好了=。=
第20楼 flyinspace 发表于 2007-05-02 18:36
银牌会员 发帖 517 积分 1,206
Originally posted by slore at 2007-5-2 05:28 AM:
晕死,好像叫新建 脚本文件.vbs

貌似删除了。。那重写看看好了=。=


呵呵,辛苦了:)

期盼ing。
第21楼 slore 发表于 2007-05-02 20:41
铂金会员 发帖 2,478 积分 5,212

Dim ADYear
Dim ADMonth
Dim ADDay
Dim ADDDay
Dim RnMod

Dim Mon(12)

Dim strDate, strADDay
strDate = "2007-3-4"
strADDay = 800

ADYear = Year(strDate)
RnMod = ADYear Mod 4
If RnMod = 0 Then tempRNYear = 1
ADMonth = Month(strDate)
ADDay = Day(strDate)

strADDay = strADDay + Date2Day(ADYear, ADMonth, ADDay)
tempYear = strADDay \ 365
tempRNday = strADDay Mod 365
If tempYear <> 0 Then
tempRNYear = tempRNYear + (RnMod + tempYear) \ 4
tempRNday = tempRNday - tempRNYear
End If

ADYear = ADYear + tempYear
MsgBox Day2Date(ADYear, tempRNday)


Function Date2Day(ByVal y, ByVal m, ByVal d)
Mon(1) = 31: Mon(2) = 28: Mon(3) = 31: Mon(4) = 30: Mon(5) = 31: Mon(6) = 30
Mon(7) = 31: Mon(8) = 31: Mon(9) = 30: Mon(10) = 31: Mon(11) = 30: Mon(12) = 31
Date2Day = 0

If IsDate(y & "/2/29") Then Mon(2) = 29
Dim i
For i = 1 To m - 1
Date2Day = Date2Day + Mon(i)
Next
Date2Day = Date2Day + d
End Function

Function Day2Date(ByVal y, ByVal Days)
Mon(2) = 28
If IsDate(y & "/2/29") Then Mon(2) = 29
Dim i

If Days > 31 Then
For i = 1 To 11
If Days < Mon(i) Then Exit For
Days = Days - Mon(i)
Next
ADMonth = i

Else
ADMonth = 1
End If
Day2Date = y & "-" & ADMonth & "-" & Days
End Function


因为每400年有97个闰年,所以存在过8年才一个闰年的情况,所以2000年为初始年的话,你不要去计算146000后的日子,那样会差1,2天,因为我是按每4年一个闰年算的。

这里我只写了+上天数的。。。-的自己改。。。我写这个只是用代码呈现下我的思路而已。。。
第22楼 slore 发表于 2007-05-02 20:45
铂金会员 发帖 2,478 积分 5,212
8000天也是很快的。。。呵呵

在strADDay=800下面加:
execute("msgbox #" & strDate & "#+" & strADDay)验证下。。。

10000还是正确的。。2000000就乱78糟了。。。我不改了。。。思路明白就OK
第23楼 flyinspace 发表于 2007-05-02 21:27
银牌会员 发帖 517 积分 1,206
刚刚测试了一下。。还算标准。。。

我写的不够用。。到时再换新的上来。。。
第24楼 namejm 发表于 2007-06-08 08:56
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  在整理索引帖子的时候发现了这个帖子,刚好本人昨天发了个求N天前日期的帖子,请参考这里:求N天前日期的批处理
第25楼 bjsh 发表于 2007-06-08 10:44
银牌会员 发帖 621 积分 2,000
Originally posted by flyinspace at 2007-5-2 05:34 PM:

算法很简单。。

也比我的用得聪明。。。但因为没有考虑闰年的存在。。

计算长一点的天数时就会出问题。。。

若加入闰年的判断。。会好很多。


没仔细看willsort的代码;
但是 瞥到了这一句;

dd+y*365+y/4-y/100+y/400

这一句 就说明了考虑到了闰年;
这种用法不是挺经典的算法么
第26楼 okmhy 发表于 2007-06-12 23:55
新手上路 发帖 7 积分 15
顶~!
很多代码看不懂....紧急学习中..
第27楼 poopoo 发表于 2008-04-17 17:19
新手上路 发帖 1 积分 2
第 15 楼
好好好
第28楼 microshaoft 发表于 2009-11-28 13:55
新手上路 发帖 4 积分 4
谢谢先
上一页  1 2
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023