歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++實現日期類函數

C++實現日期類函數

日期:2017/3/1 11:02:45   编辑:Linux編程
做了一個項目,其中涉及到了日期的處理,通過一些查找,和自己的修改,寫了一個工具類,給大家共享一下,有需要的可以直接用啦,每個方法我都基本

上寫了注釋,希望大家能好好的理解,共同進步吧。

下邊就把代碼貼出來了。

  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. int GetMonth()const //返回月份
  36. {
  37. return month;
  38. }
  39. int GetDay()const //返回日期
  40. {
  41. return day;
  42. }
  43. bool IsLeapyear() const //判斷是否為平年。
  44. {
  45. return year%400?(year%100?(year%4?(false):(true)):(false)):true;
  46. }
  47. bool IsLeapyear(const int y) const //判斷是否為平年。
  48. {
  49. return y%400?(y%100?(y%4?false:true):false):true;
  50. }
  51. void Display() const //輸出日期值
  52. {
  53. std::cout<<year<<"-"<<month<<"-"<<day<<std::endl;
  54. }
  55. //重載操作符
  56. friend Date operator + (const int v,const Date a);
  57. friend Date operator + (const Date a,const int v);
  58. friend Date operator +=(Date &a,const int v);
  59. friend Date operator ++(Date &a);
  60. friend Date operator ++(Date &a,int);
  61. friend Date operator - (const Date a,const int v);
  62. friend int operator - (const Date a,const Date b);
  63. friend Date operator -=(Date &a,const int v);
  64. friend Date operator --(Date &a);
  65. friend Date operator --(Date &a,int);
  66. friend bool operator > (const Date a,const Date b);
  67. friend bool operator >=(const Date a,const Date b);
  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 std::ostream & operator <<(std::ostream &os,const Date &d);
  73. //friend std::istream & operator >>(std::istream &is,Date &d);
  74. };

下面是實現cpp文件

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