Return to site

【信奥】用语法快速计算日期时间间隔

· 算法教程

如何用算法快速算出间隔多久呢?

1)首先一年有12个月,但是在计算机中,计数是从0开始的。

所以我们要先定义一个包含13个数值的数组。

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

days[1]指的是0月,即不存在的月份,所以days[1]=0,依次类推。

2)在日历中,有闰年和平年之分。闰年的2月是有29天的。

闰年的标志是能被4整除,但是闰年还有另外一个不是很为认知的标志:就是闰年不能被100整除!但还有一个很特殊的年份,能被400整除的年份被称为世纪年,也是闰年。闰年的2月,赋值为29,其他的不变。

所以,对年份进行判读并赋值:

int getDay(int y,int m){
if(m!=2){
return days[m];
}else{
if((y%4==0&&y%100!=0)||y%400==0){
return 29;
}else{
return 28;
}
}}

s代表start,e代表end。

y代表year,m代表month,d代表day.

sy就代表开始年份,ed代表结束日期,以此类推。

3)接下来就是计算时间了,首先我们要先判断年份的区别,当结束年月日小于等于开始年月日的时候,我们设定答案为0。

int sy,sm,sd,ey,em,ed,ans;
cin>>sy>>sm>>sd;
cin>>ey>>em>>ed;
ans=0;

当结束年月日是在开始年月日之后的时候,我们的计算公式为:

while(sy!=ey||sm!=em||sd!=ed){
ans++;
sd++;
if(sd>getDay(sy,sm)){
sd=1;
if(sm==12){
sy++;
sm=1;
}else{
sm++;
}
}
}

能不能理解这一段公式呢?

我们来用中文解读一遍,绿色是思路

当(开始年月日不完全相同的时候)

每次计数,ans+1

sd+1。

第一重判断:sd>getDay(sy,sm)

sd=1

如果日期数大于当年当月最大数值,比如2016年2月29日,实际上是不存在这个日期的,就会自动变成2016年3月1日。并且月份加1;

第二重判断:sm==12

每次月份都加1了,但是一年只有12个月,如果等于12了再加月份,就将月份赋值为1,年份+1。

这段公式的作用是什么呢?很简单,就是从开始日期,比如我们题目中的2016年6月24日开始数数,一直数到2018年1月18日结束!然后输出总共花费了多少时间。

最后输出的ans就是总共数了多个day的结果了~唔,是不是不太好理解?不妨自己动手试试吧!

以下是完整源代码:

快速计算时间间隔

答案是573,你有没有答对呢?

那么今天关于计算机日期计算的小技巧就介绍到这里咯。我是有小渔的朋友,现在还没有一个响当当的名字,如果你有好听的名字,欢迎留言告诉我哦!

有渔BOY

欢迎有渔编程公众号,每日更新少儿编程相关干货!

有渔编程公众号
All Posts
×

Almost done…

We just sent you an email. Please click the link in the email to confirm your subscription!

OK