最近在写项目的时候用到了日期相差的天数。想了想没啥可用的接口,就自己手工写了一个。
直接上代码:
myTime.h
#include "stdafx.h"
#include <stdio.h>
struct myTime
{
int year;
int month;
int day;
};
//设置日期
void SetDate(int y, int m, int d, myTime *date);
//判断是否为闰年
int IsLeapYear(int year) ;
//日期是否合法
int IsDateValid(myTime date);
//获取某个月的天数
int getMonthDay(int year,int month);
//计算两个日期的间隔天数
int diffDate(myTime bigDate,myTime smallDate);
myTime.cpp
/*************************************
//讲解一下逻辑,比如2002.2.15 和 2008.6.8
//1.获得2003 2004 2005 2006 2007年的天数
//2.获得1月到2月的天数
//3.获得2008年 1月到6月的天数
//4.获得2002年天数 减去1月到2月的天数 就是2002.2.15-2002.12.31的天数
//5.获得6.1到6.8的天数
//6.获得2.1到2.15的天数
//结果: 步骤1的天数+步骤3天数+步骤4的天数+步骤5的天数-步骤6的天数=相差的天数
//如果是同一年 如都是2008年 比如2008.2.15 和 2008.6.8
//结果:步骤1的天数+步骤3天数+步骤5的天数-步骤2的天数-步骤6的天数=相差的天数
*************************************/
#include "stdafx.h"
#include "myTime.h"
#include<iostream>
//设置日期
void SetDate(int y, int m, int d, myTime *date)
{
date-> year = y;
date-> month = m;
date-> day = d;
}
//是否闰年
int IsLeapYear(int year)
{
return ((year%4==0) && (year%100!=0)||year%400==0);
}
//日期是否合法
int IsDateValid(myTime date)
{
if(date.year <0 || date.month <1 || date.month> 12)
return 0;
if(date.day <1 || date.day> getMonthDay(date.year,date.month))
return 0;
return 1;
}
//计算两个日期的间隔天数
int diffDate(myTime bigDate,myTime smallDate)
{
int diff_Year=0; //年之间相差的天数
int smallMonday=0;
int bigMonday=0;
int diff_Day=0;
bool flag=false; //bigData 比smallData 小不小 false:不小 true 小
myTimeStruct tmp;
//从smallDate.yeay到bigDate.yeay相差多少天 如smallDate=2015 bigDate=2020 365(2016)+365(2017)+366(2018)+365 (2019) 的天数
int y=bigDate.year-smallDate.year;
if (y<0)
{
tmp=bigDate;
bigDate=smallDate;
smallDate=tmp;
flag=true;
}
for (int i = 1; i < y; i++)
{
if (IsLeapYear(smallDate.year+i))
{
diff_Year+=366;
}
else
{
diff_Year+=365;
}
}
//std::cout<<diff_Year<<std::endl;
//如2015.6到 2015.12.31天数 即2015年整年的天数减去 1-5月份的天数
for (int i = smallDate.month-1; i >=1 ; i--)
{
smallMonday+=getMonthDay(smallDate.year,smallDate.month-i);
}
// 计算如2020.1.1-2020.10.1的天数
for (int i = bigDate.month-1; i >=1 ; i--)
{
bigMonday+=getMonthDay(bigDate.year,bigDate.month-i);
}
if (bigDate.year==smallDate.year) //同一年 直接减 1月到那个月前一个月31日的天数就可以了
{
diff_Day=diff_Year+bigMonday-smallMonday+bigDate.day-smallDate.day;
}
else
{
if (IsLeapYear(smallDate.year))
{
smallMonday=366-smallMonday;
}
else
{
smallMonday=365-smallMonday;
}
//2016到2019年天数 + 2020.1到2020.10月的天数 + 2020.10.1到2020.10.28天数 - 2015.5.1到2015.5.8的天数
diff_Day=diff_Year+bigMonday+bigDate.day+smallMonday-smallDate.day;
}
if (flag==true)
{
return -diff_Day;
}
return diff_Day;
}
//获取某个月的天数
int getMonthDay(int year,int month)
{
int num;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
num=31;
break;
case 2:
num = 28+IsLeapYear(year);
break;
default:
num = 30;
}
return num;
}
int main()
{
myTime t1,t2;
SetDate(2002,12,12,&t1);
SetDate(2019,5,3,&t2);
std::cout<<"2002.12.12-2019.5.3相差天数:"<<diffDate(t2,t1)<<std::endl;
myTime t3,t4;
SetDate(2008,1,15,&t3);
SetDate(2008,12,3,&t4);
std::cout<<"2008.1.15-2008.12.3相差的天数:"<<diffDate(t4,t3)<<std::endl;
system("pause");
}
————————————————————————————————————————————————
2018.9.27 修复当年份小于当前时间的年份所计算的相差天数BUG,如20170302 与 20180927相差的天数。