日期差值计算

#include <stdio.h>

int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};	/*平年每月天数*/
int allDays[12]={31,59,90,120,151,181,212,243,273,304,334,365};/*平年天数和*/

int daysLeap[12] = {31,29,31,30,31,30,31,31,30,31,30,31};	/*闰年每月天数*/
int allDaysLeap[12]={31,60,91,121,152,182,213,244,274,305,335,366};/*闰年天数和*/


int isLeapYear(int year)
{
	if((year % 4 == 0) && (year % 100 != 0 || year % 400 == 0))
		return 1;
	return 0;
}

int diffDay(int beginDay, int endDay)
{
	return endDay - beginDay + 1;	
}


int diffMonth(int beginMon,int endMon,int beginDay,int endDay,int isleap)
{
	int difference;

	if(isleap){
		difference = allDaysLeap[endMon - 1] - (daysLeap[endMon - 1] - endDay) 
					- (allDaysLeap[beginMon - 1] - (daysLeap[beginMon - 1] - beginDay))
					+ 1;		
	}else{
		difference = allDays[endMon - 1] - (days[endMon - 1] - endDay) 
					- (allDays[beginMon - 1] - (days[beginMon - 1] - beginDay))
					+ 1;
	}

	return difference;
}

int diffYear(int beginYear, int endYear, int beginMon,
				int endMon, int beginDay, int endDay)
{
	int difference = 0;
	int isY1leap = isLeapYear(beginYear);
	int isY2leap = isLeapYear(endYear);

	/*开始日期当年剩下的天数*/
	difference += diffMonth(beginMon,12,beginDay,31,isY1leap);
	/*结束日期当年过去的天数*/
	difference += diffMonth(1,endMon,1,endDay,isY2leap);

	for(int i = beginYear + 1; i < endYear; i++)
	{
		if(isLeapYear(i))
			difference += 366;
		else
			difference += 365;
	}
	return difference;
}

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

int main()
{
	int beginDate;
	int endDate;
	int minusDay;

	/*输入时间格式YYYYMMDD*/
	while(scanf("%d%d", &beginDate, &endDate) != EOF)
	{
		/*从输入中提取年,月,日*/
		int beginYear = beginDate / 10000;
		int beginMonth = beginDate / 100 % 100;
		int beginDay = beginDate % 100;
		int endYear = endDate / 10000;
		int endMonth = endDate / 100 % 100;
		int endDay = endDate % 100;

		/*可能有起始日期大于结束日期的情况*/
		if(beginYear > endYear)
		{
			swap(&beginYear, &endYear);	
			swap(&beginMonth, &endMonth);	
			swap(&beginDay, &endDay);	
		}
		
		if(beginYear == endYear && beginMonth == endMonth){/*同年同月*/
			printf("%d\n", diffDay(beginDay, endDay));
			
		}else if(beginYear == endYear){/*同年不同月*/
		
			printf("%d\n", diffMonth(beginMonth, endMonth, beginDay, 
									endDay, isLeapYear(beginYear)));
		}else{/*不同年*/
			
			printf("%d\n", diffYear(beginYear, endYear, beginMonth, endMonth,
									beginDay, endDay));
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值