突然看到一堆的日起计算的相关问题就参考了一些代码用C++写了个程序,主要思想就是日期的偏移全部换成相对同一个日期的再计算,这样简单多了,附上代码,有问题欢迎指正
1 #include<iostream> 2 #include<ctime> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 //日期函数 7 int days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 8 struct date{ 9 int year,month,day; 10 date(int y=0,int m=0,int d=0) 11 { 12 year=y; 13 month=m; 14 day=d; 15 } 16 }; 17 //判闰年 18 inline int leap(int year){ 19 return (year%4==0&&year%100!=0)||year%400==0; 20 } 21 //判合法性 22 inline int legal(date a){ 23 if (a.month<0||a.month>12) 24 return 0; 25 if (a.month==2) 26 return a.day>0&&a.day<=28+leap(a.year); 27 return a.day>0&&a.day<=days[a.month-1]; 28 } 29 //比较日期大小 30 inline int datecmp(date a,date b){ 31 if (a.year!=b.year) 32 return a.year-b.year; 33 if (a.month!=b.month) 34 return a.month-b.month; 35 return a.day-b.day; 36 } 37 //返回指定日期是星期几 38 int weekday(date a){ 39 int tm=a.month>=3?(a.month-2):(a.month+10); 40 int ty=a.month>=3?a.year:(a.year-1); 41 return (ty+ty/4-ty/100+ty/400+(int)(2.6*tm-0.2)+a.day)%7; 42 } 43 //日期转天数偏移 44 int date2int(date a){ 45 int ret=a.year*365+(a.year-1)/4-(a.year-1)/100+(a.year-1)/400,i; 46 days[1]+=leap(a.year); 47 for (i=0;i<a.month-1;ret+=days[i++]); 48 days[1]=28; 49 return ret+a.day; 50 } 51 //天数偏移转日期 52 date int2date(int a){ 53 date ret; 54 ret.year=a/146097*400; 55 for (a%=146097;a>=365+leap(ret.year);a-=365+leap(ret.year),ret.year++); 56 days[1]+=leap(ret.year); 57 for (ret.month=1;a>=days[ret.month-1];a-=days[ret.month-1],ret.month++); 58 days[1]=28; 59 ret.day=a+1; 60 return ret; 61 } 62 //日期间隔的天数 63 inline int dateinterval(date a,date b){ 64 if(datecmp(a,b)) 65 return date2int(a)-date2int(b); 66 else 67 return date2int(b)-date2int(a); 68 } 69 //向前推若干天 70 inline date forward(date a,int b) 71 { 72 return int2date(date2int(a)-b); 73 } 74 //向后推若干天 75 inline date afterward(date a,int b) 76 { 77 return int2date(date2int(a)+b); 78 } 79 int main() 80 { 81 date date1(2013,10,11); 82 date date2(2013,1,1); 83 cout<<dateinterval(date1,date2)<<endl; 84 }