计算两个日期之间的时间差(用结构体和自定义函数完成)

【问题描述】编写一函数timedifvalue,计算两个日期之间的时间差,并将其值返回。要求:定义结构体数据类型,在主函数中完成两个日期的输入,调用timedifvalue函数计算两个日期之间的时间差。日期以年、月、日表示,“时间差”以天数表示,注意考虑日期之间的闰年。函数的输入参数为日期1和日期2,函数的返回值为时间差,单位为天数。

【输入形式】两个日期,日期以年、月、日表示

【输出形式】时间差,“时间差”以天数表示

【样例输入】2010,5,3 2013,6,9

【样例输出】1133

下面都是data1的年份早于data2的年份的形式(因为本人太笨没想出来)

step1:因为用到结构体所以先用结构体把时间表示出来

step2:再写出主函数

step3:最后完成timedifvalue函数

首先思考如何计算时间差,年-年,月-月,日-日?貌似可行但很繁琐容易多解少解。同样的方法换个角度,先计算出年的差值乘以365,然后分别算出两个时间段从1月1日到所输入的日期一共多少天,最后两个时间段相减再取绝对值(因为不知道第二个日期的月是比第一个日期的月大还是小),再+年*365就大功告成了。


int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};方便计算天数,前面多个0为了下标与月份数对上,方便理解与计算。

其中

判断是否为闰年,如果是闰年还有多一天

最后代码演示:

#include <math.h>
struct data{
	int Year;
	int Month;
	int Day;
};
int timedifvalue(struct data  data1, struct data data2)
{
	int i = data1.Year, j = data2.Year;  //i,j临时存储下面还会用到年份
	int day = 0, z1 = 0, z2 = 0;
	int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	day = (data2.Year - data1.Year) * 365;
	for (; data2.Year > data1.Year; data1.Year++)
		if (data1.Year % 400 == 0 || (data1.Year % 4 == 0 && data1.Year % 100 != 0))//判断是否为闰年
			day++;
	for (int m = 1; m <= 12; m++)
	{
		if (m < data1.Month)
			z1 += a[m];
	}
	if ((i % 400 == 0 || (i % 4 == 0 && i % 100 != 0))&&(data1.Month >=2))
		z1++;
	for (int m = 1; m <= 12; m++)
	{
		if (m < data2.Month)
			z2 += a[m];
	}
	if ((j % 400 == 0 || (j % 4 == 0 && j % 100 != 0))&&(data2.Month >=2))
		z2++;
	return abs(day += ((z2 + data2.Day) - (z1 + data1.Day)));
}
int main()
{
	struct data data1, data2;//早年写在前面
	scanf("%d%d%d",&data1.Year, &data1.Month, &data1.Day);
	scanf("%d%d%d", &data2.Year, &data2.Month, &data2.Day);
	int day = timedifvalue(data1, data2);
	printf("%d", day);
	return 0;
}

下面再来个带闰年的演示:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值