设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1158|回复: 9
打印 上一主题 下一主题

[求助]怎么实现两个日期相减

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 04:12:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
怎么在VC中实现两个日期相减,相减后得到天数?????????谢谢回复.
2#
发表于 2009-11-3 04:12:05 | 只看该作者
顶一下
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 04:12:06 | 只看该作者
用结构体来记录日期数据不就行了
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 04:12:07 | 只看该作者
今天困了 最晚后天晚上给你回复  不好意思啊
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 04:12:08 | 只看该作者
正好我写过一个类,你看看行不:

  1. /*********************************************
  2. *
  3. * Date.cpp
  4. *
  5. * Create Date : 2006-03-25
  6. * Modify Date : 2006-03-26
  7. *
  8. *********************************************/
  9. #ifndef DATE_H
  10. #define DATE_H
  11. #include <iostream>
  12. using namespace std;
  13. class Date {
  14. int year,month,day;
  15. void addOneDay(); //增加1天
  16. void subOneDay(); //减少1天
  17. int subSmallDate(const Date &date) const; //减去一个更小的 Date,返回天数
  18. public:
  19. Date(int y=0/*year*/ ,int m=0/*month*/, int d=0/*day*/);
  20. int daysPerMonth(int m=-1) const; //每月多少天?
  21. int daysPerYear(int y=-1) const; //每年多少天?
  22. int compare(const Date &date) const; //与string中的compare差不多,相等返回0
  23. bool isLeapYear(int y=-1) const; //是否闰年
  24. int subDate(const Date &date) const; //减去一个日期,返回天数
  25. Date subDays(int days) const; //减少指定的天数
  26. Date addDays(int days) const; //增加指定的天数
  27. void prtMsg(int m=1,int d=21) const; //输出日期
  28. /********** Operator Overloading ***********/
  29. Date& operator++(); //++ Date
  30. Date operator++(int); //Date ++
  31. Date& operator--(); //-- Date
  32. Date operator--(int); //Date --
  33. Date operator+(int days); //Date + days
  34. Date operator-(int days); //Date - days
  35. int operator-(const Date &date); //Date1 - Date2

  36. friend ostream& operator<<(ostream &ostrm,const Date &date) { //重载<<
  37. ostrm<<"今天是:"<<date.year<<" 年(";
  38. if(date.isLeapYear())
  39. ostrm<<"闰";
  40. else ostrm<<"平";
  41. ostrm<<"年) "<<date.month<<" 月 "<<date.day<<" 日。";
  42. return ostrm;
  43. }
  44. };
  45. #endif //DATE_H
复制代码
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 04:12:10 | 只看该作者
上面的是头文件,这里是实现:

  1. /*********************************************
  2. *
  3. * IM_Date.cpp
  4. *
  5. * Create Date : 2006-03-25
  6. * Modify Date : 2006-03-26
  7. *
  8. *********************************************/
  9. #include "Date.h"
  10. #include <iostream>
  11. using namespace std;
  12. /*************** Private Methods ****************/
  13. void Date::addOneDay() {
  14. if(++day > daysPerMonth()) {
  15. day=1;
  16. month++;
  17. }
  18. if(month>12) {
  19. month=1;
  20. year++;
  21. }
  22. }
  23. void Date::subOneDay() {
  24. if(--day < 1) {
  25. if(--month < 1) {
  26. month=12;
  27. year--;
  28. }
  29. day=daysPerMonth();
  30. }
  31. }
  32. int Date::subSmallDate(const Date &dat) const {
  33. int days=0;
  34. Date date(dat);
  35. while(year>(date.year+1)) {
  36. days+=date.daysPerYear();
  37. date.year++;
  38. }
  39. while(month>(date.month+1)) {
  40. days+=date.daysPerMonth();
  41. date.month++;
  42. }
  43. while(day>(date.day+1)) {
  44. days++;
  45. date.day++;
  46. }
  47. while(compare(date)>0) {
  48. days++;
  49. date.addOneDay();
  50. }
  51. return days;
  52. }
  53. /*************** Public Methods ****************/
  54. Date::Date(int y,int m,int d) : year(y),month(m),day(d) {
  55. if(year<0) {
  56. cout<<"*Error : Year "<<year<<" can't be negative..."<<endl;
  57. delete this;
  58. }
  59. else if(month<1 || month>12) {
  60. cout<<"*Error : "<<month<<" is a wrong Month..."<<endl;
  61. delete this;
  62. }
  63. else if(day<1 || day>daysPerMonth()) {
  64. cout<<"*Error : "<<day<<" is a wrong Day by Month "<<month<<" ..."<<endl;
  65. delete this;
  66. }
  67. }
  68. int Date::daysPerMonth(int m) const {
  69. m=(m<0)?month:m;
  70. switch(m) {
  71. case 1: return 31;
  72. case 2: return isLeapYear(year) ? 29 : 28;
  73. case 3: return 31;
  74. case 4: return 30;
  75. case 5: return 31;
  76. case 6: return 30;
  77. case 7: return 31;
  78. case 8: return 31;
  79. case 9: return 30;
  80. case 10: return 31;
  81. case 11: return 30;
  82. case 12: return 31;
  83. default: return -1;
  84. }
  85. }
  86. int Date::daysPerYear(int y) const {
  87. y=(y<0)?year:y;
  88. if(isLeapYear(y))
  89. return 366;
  90. return 365;
  91. }
  92. int Date::compare(const Date &date) const {
  93. if(year>date.year)
  94. return 1;
  95. else if(year<date.year)
  96. return -1;
  97. else {
  98. if(month>date.month)
  99. return 1;
  100. else if(month<date.month)
  101. return -1;
  102. else {
  103. if(day>date.day)
  104. return 1;
  105. else if(day<date.day)
  106. return -1;
  107. else return 0;
  108. }
  109. }
  110. }
  111. bool Date::isLeapYear(int y) const {
  112. y=(y<0)?year:y;
  113. if(0==y%400 || (0==y%4 && 0!=y%100))
  114. return true;
  115. return false;
  116. }
  117. int Date::subDate(const Date &date) const {
  118. if(compare(date)>0)
  119. return subSmallDate(date);
  120. else if(compare(date)<0)
  121. return -(date.subSmallDate(*this));
  122. else return 0;
  123. }
  124. Date Date::addDays(int days) const {
  125. Date newDate(year,month,day);
  126. if(days>0) {
  127. for(int i=0;i<days;i++)
  128. newDate.addOneDay();
  129. }
  130. else if (days<0) {
  131. for(int i=0;i<(-days);i++)
  132. newDate.subOneDay();
  133. }
  134. return newDate;
  135. }
  136. Date Date::subDays(int days) const {
  137. return addDays(-days);
  138. }
  139. /********** Operator Overloading ***********/
  140. Date& Date::operator++() { //++Date
  141. addOneDay();
  142. return *this;
  143. }
  144. Date Date::operator++(int) { //Date++
  145. Date date(*this);
  146. addOneDay();
  147. return date;
  148. }
  149. Date& Date::operator--() { //--Date
  150. subOneDay();
  151. return *this;
  152. }
  153. Date Date::operator--(int) { //Date--
  154. Date date(*this);
  155. subOneDay();
  156. return date;
  157. }
  158. Date Date::operator+(int days) { //Date+days
  159. return addDays(days);
  160. }
  161. Date Date::operator-(int days) { //Date-days
  162. return subDays(days);
  163. }
  164. int Date::operator-(const Date &date) { //Date1-Date2
  165. return subDate(date);
  166. }
  167. void Date::prtMsg(int m,int d) const {
  168. cout<<"今天是:"<<year<<" 年(";
  169. if(isLeapYear())
  170. cout<<"闰";
  171. else cout<<"平";
  172. cout<<"年) "<<month<<" 月 "<<day<<" 日";
  173. if(m==month && d==day)
  174. cout<<",生日快乐!";
  175. else cout<<"。";
  176. cout<<endl;
  177. }
复制代码
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 04:12:11 | 只看该作者
示例:

  1. /*********************************************
  2. *
  3. * IM_Date.cpp
  4. *
  5. * Creat Date : 2006-03-25
  6. * Modify Date: 2006-03-26
  7. *
  8. *********************************************/
  9. #include "Date.h"
  10. #include <iostream>
  11. using namespace std;
  12. int main() {
  13. Date date1(2006,6,20);
  14. Date date2(1986,11,5);
  15. Date date3(1986,2,18);
  16. Date date4(1987,8,1);
  17. //date2.subDays(7003).prtMsg();
  18. //date1.prtMsg();
  19. //cout<<date1<<endl;
  20. cout<<date1-date2<<endl;
  21. cout<<date1-date3<<endl;
  22. cout<<date1-date4<<endl;
  23. return 0;
  24. }
复制代码
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-3 04:12:12 | 只看该作者
還要自己寫實現代碼啊??

有沒有像 VB 中的 DateDiff 函數之類的.

我想引用 msvbvm60.dll, 然後使用裏面的方法, 不知道在 VC 怎麽引用.
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-3 04:12:13 | 只看该作者
这个代码也不长啊~~~ 你参考C++标准库看看,说不定可能有~~
回复 支持 反对

使用道具 举报

10#
发表于 2009-11-3 04:12:14 | 只看该作者
够专业的代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 14:37 , Processed in 0.126480 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表