C语言计算任意两日期之间天数

本文介绍了一种使用C语言编程的方法来计算任意两个日期之间的天数差。通过定义结构体存储日期,并实现判断闰年的功能,最终实现了日期差的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天复习了会Program in c,有道题目计算任意两个日期之间的天数:

想了好久,最后写了一个很挫的程序.....

#include <stdio.h>
struct date
{
	int year;
	int month;
	int day;
};
int main(void)
{	
	int isPrime(int year);
	int dateDiff(struct date mindate,struct date maxdate);
	struct date mindate,maxdate;
	int days;

	printf("please input the one date:");
	scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);
	printf("please input other day:");
	scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day);

	days=dateDiff(mindate,maxdate);	
    printf("the day is:%d\n",days);
    return 0;
}

/************************************************************************/
/*    判断闰年函数(4年一润,100年不润,400年再润)                         */
/************************************************************************/
int isPrime(int year)
{
	if ((year%4==0&&year%100!=0)||(year%400==0))
	{
		return 1;
	} 
	else
	{
		return 0;
	}

}

int dateDiff(struct date mindate,struct date maxdate)
{
	int days=0, flag=1;
	const int primeMonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	const int notPrimeMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	
	/************************************************************************/
	/*        交换两个日期函数,将小的日期给mindate,将大的日期给maxdate     */
    /************************************************************************/
	struct date tmp;
	if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day))
	{
		tmp=mindate;
		mindate=maxdate;
		maxdate=tmp;
	} 
	
	int maxmonth,minmonth;
	/************************************************************************/
	/* 主要思路:拿2002-8-8   2005-2-22来说                                  */                                         
	/*   将2004-8-8---2005-2-22----2005-7-8                                 */
	/*一前一后刚好N年,算出2005-2-22到2005-7-8的天数,然后用总年*36(5|6)减掉) */
	/*          2002-9-8      2005-11-22                                    */
	/*          2002-9-8-----2005-9-8-----2005-11-22(这次是加上后面天数)    */
	/*如何判断是加还是减呢?年大而月小的,则是减,程序中用flag标示             */
	/************************************************************************/
	if (maxdate.month<mindate.month)
	{
		maxmonth=mindate.month;
		minmonth=maxdate.month;
		flag=-1;
	}
	else
	{
		maxmonth=maxdate.month;
		minmonth=mindate.month;
		flag=1;
	}
	
    /************************************************************************/
    /*  从mindate.year开始累加到maxdate.year                                */
    /************************************************************************/
	for(int j=mindate.year;j<maxdate.year;++j)
	{
		if (isPrime(j)==1)
		{
			days+=366;
		}
		else
			days+=365;
	}
	
	/************************************************************************/
	/* 从minmonth累加到maxmonth,分闰年和平年                                */
	/************************************************************************/
	int day;
	if(isPrime(maxdate.year)==1)
	{
		
		for(int i=minmonth;i<maxmonth;i++)
		{
			day=primeMonth[i-1]*flag;
			days=days+day;
		}
		days=days+maxdate.day-mindate.day;
	}
	else
	{
		for (int i=minmonth;i<maxmonth;i++)
		{
			day=notPrimeMonth[i-1]*flag;
			days=days+day;
		}
		days=days+maxdate.day-mindate.day;
	}
	return days;
}

如果发现有错,请告诉我哦!!!!

测试一下,这里用mysql的datediff函数测试:


我的:




我的:


可能你测试的时候会发现,和mysql偏差一天,这我真不知道,也许是程序的问题吧,呵呵


突然发现,我想的有点问题,为什么不计算两个年份的日期到1月1号的日期呢,然后相减,哦,我想的有点复杂了,顺便将代码写的紧凑点.

#include <stdio.h>
#define isPrime(year) ((year%4==0&&year%100!=0)||(year%400==0))
struct date
{
	int year;
	int month;
	int day;
};
int main(void)
{	
	//	int isPrime(int year);
	int dateDiff(struct date mindate,struct date maxdate);
	struct date mindate,maxdate;
	int days;
	
	printf("please input the one date:");
	scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);
	printf("please input other day:");
	scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day);
	
	days=dateDiff(mindate,maxdate);	
    printf("the day is:%d\n",days);
    return 0;
}

int dateDiff(struct date mindate,struct date maxdate)
{
	int days=0,j,flag;
	const int primeMonth[][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};	
	/************************************************************************/
	/*        交换两个日期函数,将小的日期给mindate,将大的日期给maxdate     */
    /************************************************************************/
	struct date tmp;
	if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day))
	{
		tmp=mindate;
		mindate=maxdate;
		maxdate=tmp;
	} 
    /************************************************************************/
    /*  从mindate.year开始累加到maxdate.year                                */
    /************************************************************************/
	for(j=mindate.year;j<maxdate.year;++j)
		days+=isPrime(j)?366:365;
	
	//如果maxdate.year是闰年,则flag=1,后面调用primeMonth[1][12]
	flag=isPrime(maxdate.year);
	//加上maxdate.month到1月的天数
	for (j=1;j<maxdate.month;j++)
		days+=primeMonth[flag][j-1];

	//减去mindate.month到1月的天数

        flag=isPrime(maxdate.year);
        for (j=1;j<mindate.month;j++)
          days-=primeMonth[flag][j-1];
        days=days+maxdate.day-mindate.day;
        return days;
} 



在C语言中,要计算日期之间天数差异,通常会涉及到日期处理,这是一个比较复杂的问题,因为标准库并没有直接提供处理日期的函数。不过我们可以借助一些第三方库如`calender.h`,或者是自定义结构体来存储年、月、日,并编写相应的功能来计算。 以下是一个简单的示例,假设我们使用数组来表示月份的天数,并使用基本的算术运算来实现: ```c #include <stdio.h> #define YEAR1 2021 #define YEAR2 2023 typedef struct { int year; int month; int day; } Date; int days_in_month(int month, int year) { static const int month_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 假设闰年规则 return month_days[month]; } Date add_days(Date date, int num_days) { date.day += num_days; if (date.day > days_in_month(date.month, date.year)) { ++date.month; date.day -= days_in_month(date.month, date.year); if (date.month == 2 && is_leap_year(date.year)) { // 考虑闰年情况 date.day++; } } return date; } bool is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); // 根据闰年的判断条件 } void calculate_days_difference() { Date date1 = {YEAR1, 1, 1}; // 假定从2021年1月1日开始 Date date2 = {YEAR2, 12, 31}; // 到2023年12月31日结束 while (date1.year != YEAR2 || date1.month != 12 || date1.day != 31) { date1 = add_days(date1, 1); // 每天加一天直到匹配 } int diff_days = (date2.year - date1.year) * 365; // 年份差乘以平年天数 diff_days += (date2.year - date1.year) / 4; // 加上闰年差 diff_days -= (date1.year + date2.year) / 100; // 减去每百年平均减少的天数 diff_days += (date1.year + date2.year) / 400; // 再加上四百年增加的天数 printf("相差天数:%d\n", diff_days); } int main() { calculate_days_difference(); return 0; } ``` 请注意,这个示例仅适用于简单的情况,实际应用中可能需要更精确的日期处理方法,比如使用`time_t`类型或者其他第三方库来进行日期计算
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值