编写一个函数,计算两个日期之间的时间差,并将其值返回。日期以年,月,日表示,时间差以天数表示,单位为天数。
思路:
假设较小的年份为2012年11月12日,到2023年7月24日;
- 2012年到2023年有2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,这些年份计数的话只有两种情况,润年366天,平年365天,这个只需我们用循环来判断是否是润年就好了,循环加起来求总数sum;
- 随后我们就计算2012年和2023年从1月1日到11月12日过了多少天,到7月24日过了多少天;
- 小的年份,我们用今年一整年的天数减去它过了多少天,让sum加上;
- 大的年份,我们用sum直接加上今年过了多少天;
- 随即得到的sum就是我们想要求的值;
*全过程都要注意润年的特殊情况!
下面是代码演示:
#include<stdio.h>
struct data{
int year;
int month;
int day;
}data[2];
typedef int N[2];
int dataDif(int q1,int w1,int e1,int q2,int w2,int e2){
N y,m,d;
y[0]=q1;y[1]=q2;
m[0]=w1;m[1]=w2;
d[0]=e1;d[1]=e2;
int i,j,sum=0,count[2]={0,0},leap[2]={0,0};
int n,h;//起始年份和结束年份
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
n=y[0];
h=y[1];
//计算间隔年份里的天数
for(i=n+1;i<h;i++){
if((i%400==0)||(i%100!=0&&i%4==0))
sum+=366;
else sum+=365;
}
//计算较小和较大年份,过了这一年多少天
for(i=0;i<2;i++){
if((y[1]%400==0)||(y[1]%100!=0&&y[1]%4==0))
{
a[2]=29;
leap[i]=1;
}
for(j=1;j<m[i];j++){
count[i]+=a[j];
}
count[i]+=d[i];
//较小
if(i==0){
if(leap[i]==1)
sum+=366-count[i];
else sum+=365-count[i];
}
//较大
if(i==1){
if(leap[i]==1)
sum+=count[i];
else sum+=count[i];
}
}
return sum;
}
int main(){
int i,dif;
printf("请输入较小的日期和较大的日期:\n");
printf("较小的日期(年月日,用空格分隔开):");
scanf("%d %d %d",&data[0].year,&data[0].month,&data[0].day);
printf("较大的日期(年月日,用空格分隔开):");
scanf("%d %d %d",&data[1].year,&data[1].month,&data[1].day);
dif=dataDif(data[0].year,data[0].month,data[0].day,data[1].year,data[1].month,data[1].day);
printf("相差%d天",dif);
}
因为今天是2023年7月24日,所以我在日历上看到的是相差3906天
以下是运行成果: