C++实现日期类函数


做了一个项目,其中涉及到了日期的处理,通过一些查找,和自己的修改,写了一个工具类,给大家共享一下,有需要的可以直接用啦,每个方法我都基本

上写了注释,希望大家能好好的理解,共同进步吧。

下边就把代码贴出来了。

  1. /***头文件。 
  2. 只进行了一些定义 Date.h 
  3. author:wallwind  time 2011/8/29 
  4. **/  
  5. #pragma once   
  6. #include <string>   
  7. #include <iostream>   
  8. class Date  //创建一个Date类,   
  9. {  
  10.     int year,month,day;//   
  11. private:  
  12.     int DayOfMonth(int y,int m)const;//返回一个月的天数。   
  13.     int ToInt()const;//   
  14. public:  
  15.     Date() //构造函数,初始化默认的日期   
  16.         :year(1900),month(1),day(1)  
  17.     {  
  18.     }  
  19.     Date(int y,int m,int d)  
  20.         :year(y),month(m),day(d)//对日期赋值,判断有效的日期。   
  21.     {  
  22.         if((y<=0)||(m<=0 || m>12)||(d<=0 || d>DayOfMonth(y,m)))  
  23.         {  
  24.             year = 1900;  
  25.             month = day = 1;  
  26.         }  
  27.     }  
  28.     virtual ~Date()//虚析构函数。   
  29.     {  
  30.     }  
  31.     int GetYear()const//返回年份   
  32.     {  
  33.         return year;  
  34.     }  
  35.       
  36.     int GetMonth()const   //返回月份   
  37.     {  
  38.         return month;  
  39.     }  
  40.     int GetDay()const   //返回日期   
  41.     {  
  42.         return day;  
  43.     }  
  44.     bool IsLeapyear() const    //判断是否为平年。   
  45.     {  
  46.         return year%400?(year%100?(year%4?(false):(true)):(false)):true;  
  47.     }  
  48.     bool IsLeapyear(const int y) const //判断是否为平年。   
  49.     {  
  50.         return y%400?(y%100?(y%4?false:true):false):true;  
  51.     }  
  52.     void Display() const  //输出日期值   
  53.     {  
  54.         std::cout<<year<<"-"<<month<<"-"<<day<<std::endl;  
  55.     }  
  56.   
  57. //重载操作符   
  58.     friend Date operator + (const int v,const Date a);  
  59.     friend Date operator + (const Date a,const int v);  
  60.     friend Date operator +=(Date &a,const int v);  
  61.     friend Date operator ++(Date &a);  
  62.     friend Date operator ++(Date &a,int);  
  63.     friend Date operator - (const Date a,const int v);  
  64.     friend int operator - (const Date a,const Date b);  
  65.     friend Date operator -=(Date &a,const int v);  
  66.     friend Date operator --(Date &a);  
  67.     friend Date operator --(Date &a,int);  
  68.     friend bool operator > (const Date a,const Date b);  
  69.     friend bool operator >=(const Date a,const Date b);  
  70.     friend bool operator < (const Date a,const Date b);  
  71.     friend bool operator <=(const Date a,const Date b);  
  72.     friend bool operator ==(const Date a,const Date b);  
  73.     friend bool operator !=(const Date a,const Date b);  
  74.     //friend std::ostream & operator <<(std::ostream &os,const Date &d);   
  75.     //friend std::istream & operator >>(std::istream &is,Date &d);   
  76. };  

下面是实现cpp文件

  1. /*** 
  2.     Date 日期类实现。//Date.cpp  2011/8/29 
  3. author:wallwind  time 2011/8/29 
  4. ***/  
  5.   
  6. #include "Date.h"   
  7. //得到每个月的天数。。。。   
  8. int Date::DayOfMonth(int y,int m)const  
  9. {  
  10.     int d = 0;  
  11.     switch(m)  
  12.     {  
  13.     case 1:  
  14.     case 3:  
  15.     case 5:  
  16.     case 7:  
  17.     case 8:  
  18.     case 10:  
  19.     case 12:  
  20.         d = 31;  
  21.         break;  
  22.     case 4:  
  23.     case 6:  
  24.     case 9:  
  25.     case 11:  
  26.         d = 30;  
  27.         break;  
  28.     case 2:  
  29.         d = 28 + IsLeapyear(y);  
  30.         break;  
  31.     }  
  32.     return d;  
  33. }  
  34. int Date::ToInt()const  
  35. {  
  36.     int sum =0;  
  37.     for(int y=1;y<year;++y)  
  38.     {  
  39.         sum += 365+IsLeapyear(y);  
  40.     }  
  41.     for(int m=1;m<month;++m)  
  42.         sum += DayOfMonth(year,m);  
  43.     sum += day;  
  44.     return sum;  
  45. }  
  46. /////日期加天数。。const int v,const Date a。。   
  47. Date operator + (const int v,const Date a)  
  48. {  
  49.     Date d = a;  
  50.     if(v==0) return d;//如果天数为0,返回当个月   
  51.     if(v>0)//如果大于零。   
  52.     {  
  53.         d.day += v;  将当天日期加上要增加的数  
  54.         while(d.day>d.DayOfMonth(d.year,d.month))//////当加所加天数超过当月天数   
  55.         {  
  56.             d.day -= d.DayOfMonth(d.year,d.month);  
  57.             d.month++;                          //////月份加一   
  58.             if(d.month>12)                ///如果月份大于12,那么就增加一年。   
  59.             {  
  60.                 ++d.year;  
  61.                 d.month = 1;  
  62.             }  
  63.         }  
  64.         return d;  
  65.     }  
  66.     else  
  67.         return d-(-v);  
  68. }  
  69. /////日期加天数。。const Date a,const int v  同上,方法的重载。   
  70. Date operator +(const Date a,const int v)  
  71. {  
  72.     Date d = a;  
  73.     if(v==0) return d;  
  74.     if(v>0)  
  75.     {  
  76.         d.day += v;  
  77.         while(d.day>d.DayOfMonth(d.year,d.month))  
  78.         {  
  79.             d.day -= d.DayOfMonth(d.year,d.month);  
  80.             d.month++;  
  81.             if(d.month>12)  
  82.             {  
  83.                 ++d.year;  
  84.                 d.month = 1;  
  85.             }  
  86.         }  
  87.         return d;  
  88.     }  
  89.     else  
  90.         return d-(-v);  
  91. }  
  92. //////////////加操作~同上。   
  93. Date operator +=(Date &a,const int v)  
  94. {  
  95.     if(v==0) return a;  
  96.     if(v>0)  
  97.     {  
  98.         a.day+=v;  
  99.         while(a.day>a.DayOfMonth(a.year,a.month))  
  100.         {  
  101.             a.day -= a.DayOfMonth(a.year,a.month);  
  102.             a.month++;  
  103.             if(a.month>12)  
  104.             {  
  105.                 ++a.year;  
  106.                 a.month = 1;  
  107.             }  
  108.         }  
  109.         return a;  
  110.     }  
  111.     else  
  112.         return a-=(-v);  
  113. }  
  114. //////日期自增操作。。。。。。同上,,,,,   
  115. Date operator ++(Date &a)  
  116. {  
  117.     ++a.day;  
  118.     if(a.day>a.DayOfMonth(a.year,a.month))  
  119.     {  
  120.         a.day-=a.DayOfMonth(a.year,a.month);  
  121.         a.month++;  
  122.         if(a.month>12)  
  123.         {  
  124.             ++a.year;  
  125.             a.month = 1;  
  126.         }  
  127.     }  
  128.     return a;  
  129. }  
  130.   
  131. ////自增操作。   
  132. Date operator ++(Date &a,int)  
  133. {  
  134.     Date d = a;  
  135.     ++a.day;  
  136.     if(a.day>a.DayOfMonth(a.year,a.month))  
  137.     {  
  138.         a.day-=a.DayOfMonth(a.year,a.month);  
  139.         a.month++;  
  140.         if(a.month>12)  
  141.         {  
  142.             ++a.year;  
  143.             a.month = 1;  
  144.         }  
  145.     }  
  146.     return d;  
  147. }  
  148. /////减操作。。。。。   
  149. Date operator - (const Date a,const int v)  
  150. {  
  151.     Date d = a;  
  152.     if(v==0) return d;  
  153.     if(v>0)  
  154.     {  
  155.         d.day -= v;  
  156.         while(d.day<=0)  
  157.         {  
  158.             --d.month;  
  159.             if(d.month==0)  
  160.             {  
  161.                 d.month=12;  
  162.                 --d.year;  
  163.             }  
  164.             d.day+=d.DayOfMonth(d.year,d.month);  
  165.         }  
  166.         return d;  
  167.     }  
  168.     else  
  169.         return d+(-v);  
  170. }  
  171. int operator - (const Date a,const Date b)  
  172. {  
  173.     return a.ToInt()-b.ToInt();  
  174. }  
  175. Date operator -=(Date &a,const int v)  
  176. {  
  177.     if(v==0) return a;  
  178.     if(v>0)  
  179.     {  
  180.         a.day -= v;  
  181.         while(a.day<=0)  
  182.         {  
  183.             --a.month;  
  184.             if(a.month==0)  
  185.             {  
  186.                 a.month=12;  
  187.                 --a.year;  
  188.             }  
  189.             a.day+=a.DayOfMonth(a.year,a.month);  
  190.         }  
  191.         return a;  
  192.     }  
  193.     else  
  194.         return a+=(-v);  
  195. }  
  196. Date operator --(Date &a)  
  197. {  
  198.     --a.day;  
  199.     while(a.day<=0)  
  200.     {  
  201.         --a.month;  
  202.         if(a.month==0)  
  203.         {  
  204.             a.month = 12;  
  205.             --a.year;  
  206.         }  
  207.         a.day += a.DayOfMonth(a.year,a.month);  
  208.     }  
  209.     return a;  
  210. }  
  211. Date operator --(Date &a,int)  
  212. {  
  213.     Date d = a;  
  214.     --a.day;  
  215.     while(a.day<=0)  
  216.     {  
  217.         --a.month;  
  218.         if(a.month==0)  
  219.         {  
  220.             a.month = 12;  
  221.             --a.year;  
  222.         }  
  223.         a.day += a.DayOfMonth(a.year,a.month);  
  224.     }  
  225.     return d;  
  226. }  
  227. /////日期的比较。。   
  228. bool operator > (const Date a,const Date b)  
  229. {  
  230.     return a.ToInt()>b.ToInt();  
  231. }  
  232. bool operator >=(const Date a,const Date b)  
  233. {  
  234.     return a.ToInt()>=b.ToInt();  
  235. }  
  236. bool operator < (const Date a,const Date b)  
  237. {  
  238.     return a.ToInt()<b.ToInt();  
  239. }  
  240. bool operator <=(const Date a,const Date b)  
  241. {  
  242.     return a.ToInt()<=b.ToInt();  
  243. }  
  244. bool operator ==(const Date a,const Date b)  
  245. {  
  246.     return a.ToInt()==b.ToInt();  
  247. }  
  248. bool operator !=(const Date a,const Date b)  
  249. {  
  250.     return a.ToInt()!=b.ToInt();  
  251. }  
  252. /*std::ostream & operator <<(std::ostream &os,const Date &d) 
  253. { 
  254.     os<<d.year<<"-"<<d.month<<"-"<<d.day; 
  255.     return os; 
  256. } 
  257. std::istream & operator >>(std::istream &is,Date &d) 
  258. { 
  259.     Date old = d; 
  260.     is>>d.year>>d.month>>d.day; 
  261.     if((d.year<=0) ||(d.month>12||d.month<=0) || (d.day<=0||d.day>d.DayOfMonth(d.year,d.month))) 
  262.     { 
  263.         d = old; 
  264.         throw std::exception("Invalid number of date."); 
  265.     } 
  266.     return is; 
  267. } 
  268. */   

相关内容