日期计算
1 //Date.cpp 2 #include<iostream> 3 #include<time.h> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 //Date_class 8 class Date 9 { 10 private: 11 int year, month, day; 12 int week; //存放星期 13 void IncDay(); //日期增加一天函数 14 int distance(); //设成私有成员,由公有函数调用,距基准日期的天数,设基准日期为1900-1-1---B 15 int Week() { //计算星期 16 return week; 17 } 18 public: 19 Date(int y = 1900,int m = 1,int d = 1); //构造函数(default) 20 void SetSystemDate(); //取得系统日期 21 void SetDate(int yy,int mm,int dd); //日期设置 22 23 bool IsLeapYear(); //是否闰年 24 25 void print_ymd() const; //年月日输出法 26 void print_mdy() const; //月日年输出法 27 28 void AddDay(int days); //A:增加任意天数 29 bool IsEndofMonth() ; //判断是否到了月末--A 30 int Daysof2Date(Date ymd) ; //B:2个日期之间的天数---区别查表法 31 32 void ShowWeek(ostream &out); //显示星期 33 int operator - (Date ymd); //重载 —运算符 34 friend ostream& operator << (ostream &out, Date& ymd); //输出日期 35 }; 36 37 Date::Date(int y,int m,int d){ 38 SetDate(y,m,d); 39 } 40 41 void Date::SetSystemDate() //取得系统日期 42 { 43 tm *gm; //tm 是时间(含年月日分秒的结构体) 44 time_t t = time(NULL); //time_t 是长整型,,,t是总秒数; 45 gm = gmtime(&t); //函数返回给定的统一世界时间(通常是格林威治时间),如果系统不支持统一世界时间系统返回NULL 46 year = 1900 + gm->tm_year; //现在的年月日分秒 47 month = gm->tm_mon + 1; 48 day = gm->tm_mday; 49 } 50 51 void Date::SetDate(int yy,int mm,int dd) { //附带合法性检查,错误返回系统当前日期 52 //进行日期合法性检查 53 if (yy >= 1900 && yy <= 9999) 54 year = yy; 55 else { 56 cout << "年设置错误:1900~9999之间!(默认设置成系统当前日期)" << endl; 57 SetSystemDate(); 58 return ; 59 } 60 if (mm >= 1 && mm <= 12) 61 month = mm; 62 else { 63 cout << "月设置错误:1900~9999之间!(默认设置成系统当前日期)" << endl; 64 SetSystemDate(); 65 return; 66 } 67 68 switch(month) 69 { 70 //小月天数 71 case 4: 72 case 6: 73 case 9: 74 case 11: 75 if (dd >= 1 && dd <= 30) 76 day = dd; 77 else { 78 cout << "日设置错误:1900~9999之间!(默认设置成系统当前日期)" << endl; 79 SetSystemDate(); 80 return ; 81 } 82 case 2: //2月 83 if ( (IsLeapYear() && dd >= 1 && dd <= 29) || (!IsLeapYear() && dd >= 1 && dd <= 28) ) 84 day = dd; 85 else { 86 cout << "日设置错误:1900~9999之间!(默认设置成系统当前日期)" << endl; 87 SetSystemDate(); 88 return ; 89 } 90 default : //大月 91 if (dd >= 1 && dd <= 31) 92 day = dd; 93 else { 94 cout << "年设置错误:1900~9999之间!(默认设置成系统当前日期)" << endl; 95 SetSystemDate(); 96 return ; 97 } 98 } 99 } 100 101 bool Date::IsLeapYear() 102 { 103 return (year%4 == 0 && year%100 != 0) || (year%400 == 0); 104 } 105 106 void Date::print_ymd() const //年月日输出法 107 { 108 cout << year << "-" << month << "-" << day; 109 } 110 111 void Date::print_mdy() const 112 { 113 const char *MonthName[12] = {"Jau","Feb","Mar","Apri","May","June","July","Aug","Sept", 114 "Oct","Nov","Dec"}; 115 cout << MonthName[month-1] << " " << day << "," << year ; 116 } 117 118 void Date::IncDay() //增加一天 119 { 120 if(IsEndofMonth()) //增加天数,记得要判断是否是年末,月末 121 { 122 if(month == 12) 123 { 124 day = 1; month = 1; year++; 125 } 126 else //已经是IsEndMonth 127 day = 1; month++; 128 } 129 else 130 day++; 131 } 132 133 bool Date::IsEndofMonth() 134 { 135 switch(month) 136 { 137 case 4: 138 case 6: 139 case 9: 140 case 11: return day == 30; 141 case 2: 142 if (IsLeapYear()) 143 return day == 29; 144 else 145 return day == 28; 146 default: 147 return day == 31; 148 } 149 } 150 void Date::AddDay(int days) 151 { 152 for (int i = 0; i <= days; i++) //增加多少天--day1->day2 = day+1 153 { 154 IncDay(); 155 } 156 } 157 158 /*int years = year - 1; //相隔多少年,,用其算的才是前几年应该有的天数 159 totalDays = years*365 + years/4 - years/100 + years/400 //因为DAY...是按闰年算的年份包含闰年的已经算好 160 + DAYS_BEFORE_MONTH[month-1] + day; 161 if (IsLeapYear() && month > 2) totalDays++; 162 //(闰年)当大于2月时,天数要加1;(注:该法查表代码简洁,但是需要记住表)*/ 163 164 int Date::distance() //距离基准日期的天数, 先算到指定年的天数+一月到指定月份天数+指定天数 165 { 166 int days; 167 int years = year-1900; 168 days = years*365 + years/4 - years/100 + years/400; //不计闰年的天数 169 // if(years) // 170 // days += (years-1)/4; //逢闰年+1天 171 switch(month) //此处方法不错,从12月份算起,输入多少月份就能加到哪个月 172 { //注意,无break; 173 case 12: days = days + 30; 174 case 11: days = days + 31; 175 case 10: days = days + 30; 176 case 9: days = days + 31; 177 case 8: days = days + 31; 178 case 7: days = days + 30; 179 case 6: days = days + 31; 180 case 5: days = days + 30; 181 case 4: days = days + 31; 182 case 3: 183 if (IsLeapYear()) 184 days = days + 29; 185 else 186 days = days + 28; 187 case 2: days = days + 31; 188 default : break; 189 } 190 days = days + day; //多少天只要加多少天就可以了,(年月已经知道过了多少天) 191 return days; 192 } 193 194 int Date::Daysof2Date(Date ymd) //两个日期的天数 195 { 196 int days; 197 days = abs(distance()-ymd.distance()); //distance()返回值是指定日期到基准类的天数(本类日期-指定日期) 198 return days; //2个日期之间的天数 199 } 200 201 void Date::ShowWeek(ostream &out) //显示该日期是星期几 202 { 203 week = distance() % 7; 204 const char w[7][3] = {"天", "一", "二", "三", "四", "五", "六"}; 205 out << year << "-" << month << "-" << day << "--星期" << w[week] << endl; 206 } 207 208 int Date::operator - (Date ymd) 209 { 210 return Daysof2Date(ymd); 211 } 212 213 ostream& operator << (ostream& out, Date& ymd) 214 { 215 ymd.ShowWeek(out); 216 return out; 217 } 218 219 int main(void) 220 { 221 Date date1, date2; 222 int year, month, day; 223 cout << "please input year, month, day: " << endl; 224 cin >> year >> month >> day; 225 // date1.SetDate(2013,1,27); 226 // cout << "the current date is : " << endl; 227 // date1.print_ymd(); 228 // date1.print_mdy(); 229 // date1.AddDay(100); 230 // cout << "After 100 days , the date is :"; 231 // date1.print_ymd(); 232 date1.SetDate(year, month, day); 233 cout << date1; 234 235 cout << "please input the date(year,month,day) in the future : " << endl; 236 cin >> year >> month >> day; 237 date2.SetDate(year,month,day); 238 date2.print_mdy(); 239 cout << " 距离 :"; 240 date1.print_mdy(); 241 cout << " have "<< date1-date2 << " days" << endl; 242 243 cout << "输入(想要经历的)天数(将显示当前日期后(N天)的日期: " << endl; 244 cin >> day; 245 date1.print_ymd(); 246 date1.AddDay(day); 247 cout << ", After " << day << " days, the date is : " << date1; 248 249 return 0; 250 }