中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-07-02 14:04
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [挑战5]:日期的前后时间计算 [难度:☆☆] 查看 4,768 回复 27
16 发表于 2007-05-02 17:52 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
我有个思路就是求余...除365 余数Y1再先对4求余(闰年)看有几个闰年给Y1要再减几个1,得到Y2

然后Y2化成月和日即可。。。
(哈哈,还是execute够偷懒)
17 发表于 2007-05-02 18:10 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
噢。仔细看了一下。确实考虑到了闰年。。

原理研究中?
知,不觉多。不知,乃求知
18 发表于 2007-05-02 18:24 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
Originally posted by slore at 2007-5-2 04:52 AM:
我有个思路就是求余...除365 余数Y1再先对4求余(闰年)看有几个闰年给Y1要再减几个1,得到Y2

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


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

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

这一点上,无论如何请不要偷懒了。
知,不觉多。不知,乃求知
19 发表于 2007-05-02 18:28 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
晕死,好像叫新建 脚本文件.vbs

貌似删除了。。那重写看看好了=。=
20 发表于 2007-05-02 18:36 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
Originally posted by slore at 2007-5-2 05:28 AM:
晕死,好像叫新建 脚本文件.vbs

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


呵呵,辛苦了:)

期盼ing。
知,不觉多。不知,乃求知
21 发表于 2007-05-02 20:41 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线

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年一个闰年算的。

这里我只写了+上天数的。。。-的自己改。。。我写这个只是用代码呈现下我的思路而已。。。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
flyinspace +3 2007-05-02 21:26
22 发表于 2007-05-02 20:45 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
8000天也是很快的。。。呵呵

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

10000还是正确的。。2000000就乱78糟了。。。我不改了。。。思路明白就OK
23 发表于 2007-05-02 21:27 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
刚刚测试了一下。。还算标准。。。

我写的不够用。。到时再换新的上来。。。
知,不觉多。不知,乃求知
24 发表于 2007-06-08 08:56 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  在整理索引帖子的时候发现了这个帖子,刚好本人昨天发了个求N天前日期的帖子,请参考这里:求N天前日期的批处理
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
25 发表于 2007-06-08 10:44 ·  IANA 局域网IP(Private-Use)
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
Originally posted by flyinspace at 2007-5-2 05:34 PM:

算法很简单。。

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

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

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


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

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

这一句 就说明了考虑到了闰年;
这种用法不是挺经典的算法么
26 顶~! 发表于 2007-06-12 23:55 ·  中国 广东 深圳 龙岗区 电信
新手上路
积分 15
发帖 7
注册 2006-06-23 13:36
20年会员
UID 57456
状态 离线
很多代码看不懂....紧急学习中..
27 第 15 楼 发表于 2008-04-17 17:19 ·  中国 浙江 杭州 电信
新手上路
积分 2
发帖 1
注册 2008-04-17 16:52
18年会员
UID 116164
性别 男
状态 离线
好好好
28 发表于 2009-11-28 13:55 ·  中国 北京 联通
新手上路
积分 4
发帖 4
注册 2009-11-24 00:25
16年会员
UID 155228
性别 男
状态 离线
谢谢先
论坛跳转: