日期的各种计算

突然看到一堆的日起计算的相关问题就参考了一些代码用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 }

 

posted @ 2013-10-13 00:03  mrbean  阅读(380)  评论(0编辑  收藏  举报