日期处理
日期差值的问题总会令人感到很头痛,因为总是需要处理平年瑞年带来的二月天数问题以及,大 月小月问题,然而这种日期差值问题往往有一个很直接了当的解决方式,即将小的那个日期循环不断加一,并计算每一次加一的次数,直到小的那个日期和大的那个日期相等为止。
需要注意,对天数进行加一操作时,当达到该月最大天数加一时,应当使当前月份进一,重置天数为1号,当月数达到13时,应使年份进一,月份重置为1月。
对于闰年平年以及大月小月的处理,不妨定义数组int month[13][2],其中,第二维中0表示平年,1表示闰年,闰年二月28,平年二月29。
int month[13][2] = {
{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},
{31,31},{30,30},{31,31}
};
为了方便取出平年闰年的月份数,需定义一个判断是否是闰年的函数:
bool isLeap(int year){
return ((year%4 == 0 && year %100 != 0 )|| year % 400 == 0);
}
对于输入格式为20010308,20010308/10000将得到年份y,200100308%10000将得到月份和天数,将该结果除以100将得到月份m,将该结果对100取余将得到天数d。
C++的简单源码示例:
#include <iostream>
#include <stdio.h>
using namespace std;
//定义月份数组,第二维中第一个元素表示平年,第二个元素表示闰年
int month[13][2] = {
{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},
{31,31},{30,30},{31,31}
};
//判断平年,闰年
bool isLeap(int year){
return ((year%4 == 0 && year %100 != 0 )|| year % 400 == 0);
}
int main()
{
//输入两个日期,如20011208
int time1,time2;
scanf("%d %d",&time1,&time2);
//如果第一个第日期小于第二个日期,交换他们的位置
if(time1 > time2){
int temp =time1;
time1 = time2;
time2 = temp;
}
//获得年份
int y1 = time1 /10000;
//获得月份
int m1 = time1 % 10000/100;
//获得天数
int d1 = time1 % 100;
int y2 = time2 /10000;
int m2 = time2 % 10000/100;
int d2 = time2 % 100;
//间隔天数
int result = 1;
//当两个日期的年月日相等时,退出循环,有一个不满足则继续循环
while (y1 < y2 || m1 < m2 || d1 < d2){
//天数自增
d1++;
//当天数等于单前月份满天数+1,则月份进一,重置天数为1
if(d1 == month[m1][isLeap(y1)] + 1) {
m1++;
d1 = 1;
}
//当月份进位到13时,年份进1,重置月份为1
if(m1 == 13){
y1 ++;
m1 = 1;
}
//间隔天数加一
result ++ ;
}
printf("%d\n",result);
return 0;
}
标签:int,天数,31,30,time1,time2,日期,差值,计算
From: https://www.cnblogs.com/elunking/p/17569660.html