日期处理
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;
}