使用C语言计算两个日期之间间隔的天数

函数介绍:通过输入起始日期和目标日期,计算这两个日期之间相隔多少天。当起始日期大于目标日期时,输出负数;如果输入有误,则输出“输入错误”。

⭐主函数中的参数介绍:

birthday_year  起始日期的年

birthday_month  起始日期的月

birthday_day  起始日期的日

today_year  目标日期的年

today_month 目标日期的月

today_day 目标日期的日

t  如果起始日期大于目标日期,则作为交换两者的中间变量

⭐实现判断闰年的方法:

判断闰年首先要满足:①年数%4==0②年数%100 != 0③年数%400==0也算闰年,所以只需要满足如下表达式即可:

year % 400 == 0 || year % 4 == 0 && year % 100 != 0

首先 ,我定义了两个函数part_1(负责计算天数)和 part_2(负责计算没有过完的年已经过去的天数)

(1)先看part_2(负责计算没有过完的年已经过去的天数):

int part_2(int year, int month, int day)
{
	int sum = day, temp;
	//定义变量
	int month_a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	//通过定义数组来储存各个月份有多少天

	if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
	{
		month_a[1] = month_a[1] + 1;
	}
	//如果检测到闰年,2月对应的数组元素值+1
	for (temp = 0; temp + 1 < month; temp++)
	{
		sum = sum + month_a[temp];
	}
	return sum;
	//计算天数
}//该函数通过输入年月日计算没有过完的年已经过去的天数

part_2函数的思路是首先通过数组储存各个月份的天数,默认二月份对应的数组元素是28,当检测到闰年时,则+1。通过计算之前以及过完的月份的天数的总和再加上没过完的月份以及过去的天数就能得出没有过万的年已经过去的天数啦。

(2)然后我们来看part_1(负责计算天数):

int part_1(int birthday_year, int birthday_month, int birthday_day, int today_year, int today_month, int today_day)
{
	int sum=0;
	int m = 0, n = 0, a;
	//当起始日和终止日同年
	if (birthday_year == today_year)
	{
		sum = part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
	}
	//当起始日和终止日相差一年
	if (birthday_year + 1 == today_year)
	{
		if (birthday_year % 400 == 0 || birthday_year % 4 == 0 && birthday_year % 100 != 0)
		{
			sum = 366 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}
		else
		{
			sum = 365 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}
	}
	//当起始日和终止日相差一年以上
	if (today_year > birthday_year + 1)
	{
		for (a = birthday_year + 1; a < today_year; a++)
		{
			if (a % 400 == 0 || a % 4 == 0 && a % 100 != 0)
			{
				n++;
			}
		}
		if (birthday_year % 400 == 0 || birthday_year % 4 == 0 && birthday_year % 100 != 0)
		{
			sum = (today_year - birthday_year - 1) * 365 + n + 366 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}
		else
		{
			sum = (today_year - birthday_year - 1) * 365 + n + 365 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}


	}//计算天数
	printf("%d天", sum);
	return 0;
}

首先设计这个函数的时候我分成了三种情况讨论,

①起始日期和目标日期在同一年:举个例子,起始日期和目标日期都在2003年。这种情况下,只需计算  目标日期在该年已经过去的天数  减去  起始日期已经过去的天数即可  。计算方式如下:

sum = part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);

②起始日期和目标日期相差一年:举个例子,起始日期在2003年,目标日期在2004年。这种情况下,则要先计算出  起始日期在当年还剩下多少天  然后再加上  目标日期已经过去的天数即可。此时需要分为闰年和非闰年两种情况。计算方式如下:

闰年:

sum = 366 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);

非闰年:

sum = 365 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);

③起始日期和目标日期相差一年以上:这种情况下,首先要计算除去起始日期和目标日期那两年,它们之间总共有多少个闰年,当检测到闰年时,计数器n就+1。

for (a = birthday_year + 1; a < today_year; a++)
		{
			if (a % 400 == 0 || a % 4 == 0 && a % 100 != 0)
			{
				n++;
			}
		}

然后再计算起始日期和目标日期总共隔了多少天:

if (birthday_year % 400 == 0 || birthday_year % 4 == 0 && birthday_year % 100 != 0)
		{
			sum = (today_year - birthday_year - 1) * 365 + n + 366 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}
		else
		{
			sum = (today_year - birthday_year - 1) * 365 + n + 365 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}

这样自定义函数part_2就设计完成了。

(3)主函数

在该函数中,我们要实现①输入起始日期和目标日期。②检测起始日期和目标日期的输入是否出错③起始日期是否大于目标日期,是则输入负数。

int main(void)
{
	int birthday_year, birthday_month, birthday_day;
	int today_year, today_month, today_day;
	int t;
	//定义变量部分
	printf_s("你的出生日期是?:");
	scanf_s("%d%d%d", &birthday_year, &birthday_month, &birthday_day);
	printf("今天的日期是:");
	scanf_s("%d%d%d", &today_year, &today_month, &today_day);
	//输入目标日期和起始日期
	
	if (birthday_year < 0 || birthday_month>12 || birthday_month < 1 || birthday_day>31 || birthday_day < 1)
	{
		printf("输入错误");
		return 0;
	}
	if (birthday_year % 400 == 0 || birthday_year % 4 == 0 && birthday_year % 100 != 0)
	{
		if (birthday_month == 2 && birthday_day > 29)
		{
			printf("输入错误");
			return 0;
		}
	}
	else
	{
		if (birthday_month == 2 && birthday_day > 28)
		{
			printf("输入错误");
			return 0;
		}
	}
	if (today_year < 0 || today_month>12 || today_month < 1 || today_day>31 || today_day < 1)
	{
		printf("输入错误");
		return 0;
	}
	if (today_year % 400 == 0 || today_year % 4 == 0 && today_year % 100 != 0)
	{
		if (today_month == 2 && today_day > 29)
		{
			printf("输入错误");
			return 0;
		}
	}
	else
	{
		if (today_month == 2 && today_day > 28)
		{
			printf("输入错误");
			return 0;
		}
	}
	//判断输入的日期是否出错


	
	if (birthday_year > today_year || birthday_year == today_year && birthday_month > today_month || birthday_year == today_year && birthday_month == today_month && birthday_day > today_day)
	{
		t = birthday_year;
		birthday_year = today_year;
		today_year = t;
		t = birthday_month;
		birthday_month = today_month;
		today_month = t;
		t = birthday_day;
		birthday_day = today_day;
		today_day = t;
		printf("到你的出生日期一共有-");
		part_1(birthday_year, birthday_month, birthday_day, today_year, today_month, today_day);
	}
	//如果起始日期小于目标日期,进行一次调换,并加上负号
	else
	{
		printf("到你的出生日期一共有");
		part_1(birthday_year, birthday_month, birthday_day, today_year, today_month, today_day);
	}
	return 0;
}
//主函数

①略

②实现检测目标日期和起始日期输入是否出错的方法如下:

if (birthday_year < 0 || birthday_month>12 || birthday_month < 1 || birthday_day>31 || birthday_day < 1)
	{
		printf("输入错误");
		return 0;
	}
	if (birthday_year % 400 == 0 || birthday_year % 4 == 0 && birthday_year % 100 != 0)
	{
		if (birthday_month == 2 && birthday_day > 29)
		{
			printf("输入错误");
			return 0;
		}
	}
	else
	{
		if (birthday_month == 2 && birthday_day > 28)
		{
			printf("输入错误");
			return 0;
		}
	}
	if (today_year < 0 || today_month>12 || today_month < 1 || today_day>31 || today_day < 1)
	{
		printf("输入错误");
		return 0;
	}
	if (today_year < 0 || today_month>12 || today_month < 1 || today_day>31 || today_day < 1)
	{
		printf("输入错误");
		return 0;
	}
	if (today_year % 400 == 0 || today_year % 4 == 0 && today_year % 100 != 0)
	{
		if (today_month == 2 && today_day > 29)
		{
			printf("输入错误");
			return 0;
		}
	}
	else
	{
		if (today_month == 2 && today_day > 28)
		{
			printf("输入错误");
			return 0;
		}
	}
	//判断输入的日期是否出错

③检测起始日期是否大于目标日期,是则输入负数。

思路是:如果检测到起始日期大于目标日期,则将起始日期和目标日期的数值互换,并在前方加上负号

if (birthday_year > today_year || birthday_year == today_year && birthday_month > today_month || birthday_year == today_year && birthday_month == today_month && birthday_day > today_day)
	{
		t = birthday_year;
		birthday_year = today_year;
		today_year = t;
		t = birthday_month;
		birthday_month = today_month;
		today_month = t;
		t = birthday_day;
		birthday_day = today_day;
		today_day = t;
		printf("到你的出生日期一共有-");
		part_1(birthday_year, birthday_month, birthday_day, today_year, today_month, today_day);
	}
	//如果起始日期小于目标日期,进行一次调换,并加上负号

到此,该函数便设计完成了

以下是整个函数:

#include<stdio.h>

int part_1(int birthday_year, int birthday_month, int birthday_day, int today_year, int today_month, int today_day);
int part_2(int year, int month, int day);

int part_1(int birthday_year, int birthday_month, int birthday_day, int today_year, int today_month, int today_day)
{
	int sum=0;
	int m = 0, n = 0, a;
	//当起始日和终止日同年
	if (birthday_year == today_year)
	{
		sum = part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
	}
	//当起始日和终止日相差一年
	if (birthday_year + 1 == today_year)
	{
		if (birthday_year % 400 == 0 || birthday_year % 4 == 0 && birthday_year % 100 != 0)
		{
			sum = 366 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}
		else
		{
			sum = 365 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}
	}
	//当起始日和终止日相差一年以上
	if (today_year > birthday_year + 1)
	{
		for (a = birthday_year + 1; a < today_year; a++)
		{
			if (a % 400 == 0 || a % 4 == 0 && a % 100 != 0)
			{
				n++;
			}
		}
		if (birthday_year % 400 == 0 || birthday_year % 4 == 0 && birthday_year % 100 != 0)
		{
			sum = (today_year - birthday_year - 1) * 365 + n + 366 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}
		else
		{
			sum = (today_year - birthday_year - 1) * 365 + n + 365 + part_2(today_year, today_month, today_day) - part_2(birthday_year, birthday_month, birthday_day);
		}


	}//计算天数
	printf("%d天", sum);
	return 0;
}
int main(void)
{
	int birthday_year, birthday_month, birthday_day;
	int today_year, today_month, today_day;
	int t;
	//定义变量部分
	printf_s("你的出生日期是?:");
	scanf_s("%d%d%d", &birthday_year, &birthday_month, &birthday_day);
	printf("今天的日期是:");
	scanf_s("%d%d%d", &today_year, &today_month, &today_day);
	//输入目标日期和起始日期
	
	if (birthday_year < 0 || birthday_month>12 || birthday_month < 1 || birthday_day>31 || birthday_day < 1)
	{
		printf("输入错误");
		return 0;
	}
	if (birthday_year % 400 == 0 || birthday_year % 4 == 0 && birthday_year % 100 != 0)
	{
		if (birthday_month == 2 && birthday_day > 29)
		{
			printf("输入错误");
			return 0;
		}
	}
	else
	{
		if (birthday_month == 2 && birthday_day > 28)
		{
			printf("输入错误");
			return 0;
		}
	}
	if (today_year < 0 || today_month>12 || today_month < 1 || today_day>31 || today_day < 1)
	{
		printf("输入错误");
		return 0;
	}
	if (today_year < 0 || today_month>12 || today_month < 1 || today_day>31 || today_day < 1)
	{
		printf("输入错误");
		return 0;
	}
	if (today_year % 400 == 0 || today_year % 4 == 0 && today_year % 100 != 0)
	{
		if (today_month == 2 && today_day > 29)
		{
			printf("输入错误");
			return 0;
		}
	}
	else
	{
		if (today_month == 2 && today_day > 28)
		{
			printf("输入错误");
			return 0;
		}
	}
	//判断输入的日期是否出错


	
	if (birthday_year > today_year || birthday_year == today_year && birthday_month > today_month || birthday_year == today_year && birthday_month == today_month && birthday_day > today_day)
	{
		t = birthday_year;
		birthday_year = today_year;
		today_year = t;
		t = birthday_month;
		birthday_month = today_month;
		today_month = t;
		t = birthday_day;
		birthday_day = today_day;
		today_day = t;
		printf("到你的出生日期一共有-");
		part_1(birthday_year, birthday_month, birthday_day, today_year, today_month, today_day);
	}
	//如果起始日期小于目标日期,进行一次调换,并加上负号
	else
	{
		printf("到你的出生日期一共有");
		part_1(birthday_year, birthday_month, birthday_day, today_year, today_month, today_day);
	}
	return 0;
}
//主函数

int part_2(int year, int month, int day)
{
	int sum = day, temp;
	//定义变量
	int month_a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	//通过定义数组来储存各个月份有多少天

	if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
	{
		month_a[1] = month_a[1] + 1;
	}
	//如果检测到闰年,2月对应的数组元素值+1
	for (temp = 0; temp + 1 < month; temp++)
	{
		sum = sum + month_a[temp];
	}
	return sum;
	//计算天数
}//该函数通过输入年月日计算没有过完的年已经过去的天数

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值