主题:求教jtchang日期差公式
sun_xg
[专家分:0] 发布于 2003-06-29 22:32:00
多谢您上次的回复不过
公式y1+=(day1-1)+(year1-1)/4-(year1-1)/100+(year1-1)/400;
不明白?能不能解释一下!多谢!
PASCAL语言讨论区里您的回复我没找到!多谢了!
回复列表 (共1个回复)
沙发
jtchang [专家分:5370] 发布于 2003-06-30 00:46:00
呵呵!是我不好,因为计算过程中用了偷懒的办法。中间用数学正负抵消了。
我们先不管两个日期,只考虑:一个日期,距离公元1年1月1日,是多少天。
(1)
y1=0;
for(i=1;i<month1;i++)
y1+=getdays(year1,i);
这里算的是:假设今天是某个月的1日,相对今年1月1日过了多少天了。
(2)y1+=(day1-1)
今天相对今年1月1日,过了多少天了.
(3)那么,剩下来的,今年年1月1日,距离公元1年1月1日多少天,加上y1,就是今天距公元1年1月1日是多少天。假设今年为year1年。
今年1月1日,离公元1年1月1日是多少天呢?
假设:每年都是365天,没有闰年:
x= (year1-1)*365
由于每四年闰一次,加一天:
x= (year1-1)*365+(year1-1)/4
但是,每100年,取消了一个闰年,变成了:
x= (year1-1)*365+(year1-1)/4-(year1-1)/100
最后,每400年,又加多一个闰年:
x= (year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400;
最后,x+y1就是答案了。即:今天离公元1年1月1日,是多少天。
我们知道,对于加法,先加后加哪部分都一样的,所以,我把闰年数先加,
(year1-1)*365等以后再加:
这就是:
y1+=(day1-1)+(year1-1)/4-(year1-1)/100+(year1-1)/400;
这个语句的来历。
类似地,对于另一个日期y2,也得到这个答案。
因为你用到的是两个日期相减,
那么就是完整的写法是:
y1+(year1-1)*365- (y2+(year2-1)*365)
=y1-y2+ (year1-year2)*365
这么一来。我就直接写成了这么一句话:
return((y1-y2)+(long)(year1-year2)*365);
呵呵!太偷懒了,不过也有个好处,直接算怕数太大溢出。
我来回复