codeup1928-日期差值

日期处理

1.从第前一个日期一天一天加到最后一个日期,到本月的最后一天 + 1时,令月份m+1,天数d = 1,当月份m加到13时,令年y+1,直到加到y2m2d1.注意判断闰年,一年只有365或366天,100年也不过3w多天所以一天一天加时间上不会超时。此方法不用考虑过多细节。

int questDay(int y1, int m1, int d1, int y2, int m2, int d2) {
	int day = 1;
	while (y1 < y2 || m1 < m2 || d1 < d2) {
		d1++;
		if (d1 > month[isRun(y1)][m1]) { // 当d1等于本月最后一天的天数+1时 
			m1++;
			d1 = 1; // 从下月1号开始 
		}
		if (m1 == 13) {
			m1 = 1; // 从下年1月开始
			y1++;
		}
		day++; // 总天数 
	}
	return day; 
}

2.加速求天数,直接计算得总天数,需要考虑几个细节
相同算法:求同年的开始日期到结束日期的天数。
例:求20010405 — 20030504
可以将日期分割为求20010405-20011231 + 2002年的天数+20030101-20030504之间的天数。
其中求20010405-20011231----和20030101-20030504的天数都可以归结为一种算法。即计算同年开始日期到结束日期总天数。
计算开始日期0405到0430之间天数,和结束日期1201到结束日期1231的总天数。

int preAdd(int y1, int m1, int d1, int m2, int d2)// 同年两个日期之间的天数。
{
	int m;
	if (m1 == m2)
		return d2 - d1 + 1; // 注意点---特判同月 
	int day = 0;
	if (isRun(y1)) // 闰年 
		m = 1;
	else 
		m = 0;
	day += month[m][m1] - d1 + 1; // d1 到月底剩余天数 
	for (int i = m1 + 1; i < m2; i++) //  计算m1-m2之间月份的总天数
		day += month[m][i];		
	day += d2; // m2月天数 
	return day;
} 

完整代码

#include <iostream>
#include <cstdio>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int questDay(int y1, int m1, int d1, int y2, int m2, int d2);
int month[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31},
					{0,31,29,31,30,31,30,31,31,30,31,30,31}}; 
int isRun(int y)
{
	return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

int preAdd(int y1, int m1, int d1, int m2, int d2)// 同年两个日期之间的天数。
{
	int m;
	if (m1 == m2)
		return d2 - d1 + 1; // 同月 
	int day = 0;
	if (isRun(y1)) // 闰年 
		m = 1;
	else 
		m = 0;
	day += month[m][m1] - d1 + 1; // d1 到月底剩余天数 
	for (int i = m1 + 1; i < m2; i++) //  
		day += month[m][i];		
	day += d2; // m2月天数 
	return day;
} 
/*
20130101
20130105
*/
 
int main(int argc, char** argv) {
	
	int time1, time2, y1, m1, d1, y2, m2, d2, day;

	while (scanf("%d%d",&time1,&time2) != EOF)
	{
		day = 0; // 注意---多实例测试,day赋初值要放在循环里 
		if (time1 > time2)
		{
			int t = time1;
			time1 = time2;
			time2 = t;
		} 
		y1 = time1 / 10000;
		m1 = (time1 / 100) % 100;
		d1 = time1 % 100;
		y2 = time2 / 10000;
		m2 = (time2 / 100) % 100;
		d2 = time2 % 100;
		if (y1 == y2)
		{
			day +=  preAdd(y1,m1,d1,m2,d2); 
		}
		else
		{
			day += preAdd(y1,m1,d1,12,31);
			for (int i = y1 + 1; i < y2; i++)
			{
				if (isRun(i))
					day += 366;
				else
					day += 365;
			} 
			day += preAdd(y2,1,1,m2,d2);
		} 

//		day = questDay(y1, m1, d1, y2, m2, d2);
		printf("%d\n",day);
	}
	return 0;
}
// 方法1
int questDay(int y1, int m1, int d1, int y2, int m2, int d2) {
	int day = 1;
	while (y1 < y2 || m1 < m2 || d1 < d2) {
		d1++;
		if (d1 > month[isRun(y1)][m1]) { // 当d1等于本月最后一天的天数+1时 
			m1++;
			d1 = 1; // 从下月1号开始 
		}
		if (m1 == 13) {
			m1 = 1; // 从下年1月开始
			y1++; 
		}
		day++; // 总天数 
	}
	return day; 
}
发布了17 篇原创文章 · 获赞 0 · 访问量 468

猜你喜欢

转载自blog.csdn.net/qq_37866436/article/details/103819636
今日推荐