回 帖 发 新 帖 刷新版面

主题:求教jtchang日期差公式

多谢您上次的回复不过
公式y1+=(day1-1)+(year1-1)/4-(year1-1)/100+(year1-1)/400;
不明白?能不能解释一下!多谢!
PASCAL语言讨论区里您的回复我没找到!多谢了!

回复列表 (共1个回复)

沙发

呵呵!是我不好,因为计算过程中用了偷懒的办法。中间用数学正负抵消了。
我们先不管两个日期,只考虑:一个日期,距离公元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);

呵呵!太偷懒了,不过也有个好处,直接算怕数太大溢出。

我来回复

您尚未登录,请登录后再回复。点此登录或注册