日期相关的计算
今天(Sun, 16 Sep 2018 06:34:57 +0000)帮同学写一个日期相关的c++题,竟然耗费了很多时间,不得不感叹自己真是老了。 首先定义类用年月日(yy,mm,dd)存储日期 日期±天数,直接加减到“天”上,然后“多退少补”。 两日期之间相差天数。我是先计算两日前距元年元月元日的天数,然后直接相减。但我这么算,老是差几天,调试了好久,甚至我都一度打算放弃,直接调用上面做的日期加天数一天一天往上累加(可以预料到这会用多长时间)。 最后才检查出,竟然是判断闰年出错了,我把取余弄成了整除,闰年哭晕在厕所。 老了,真的老了。
今天(Sun, 16 Sep 2018 06:34:57 +0000)帮同学写一个日期相关的c++题,竟然耗费了很多时间,不得不感叹自己真是老了。 首先定义类用年月日(yy,mm,dd)存储日期 日期±天数,直接加减到“天”上,然后“多退少补”。 两日期之间相差天数。我是先计算两日前距元年元月元日的天数,然后直接相减。但我这么算,老是差几天,调试了好久,甚至我都一度打算放弃,直接调用上面做的日期加天数一天一天往上累加(可以预料到这会用多长时间)。 最后才检查出,竟然是判断闰年出错了,我把取余弄成了整除,闰年哭晕在厕所。 老了,真的老了。
#include <iostream>
using namespace std;
class TMyDate
{
private:
int yy,mm,dd;
bool isrn(int year)//判断闰年
{
if((year%4==0&&year%100!=0)||(year%400==0))
{
return true;
}
return false;
}
int getDaysofmonth(int y,int m)//某年某月有多少天
{
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if(isrn(y)){
return 29;
}
return 28;
default:
return 30;
}
}
int getTotaldays(int y,int m,int d){//某年月日距元年元月元日天数
int sum=0;
sum+=d;
m--;
while(m--){
sum+=getDaysofmonth(y,m);
}
y--;
while(y--){
sum+=isrn(y)?366:365;
}
return sum;
}
public:
TMyDate()
{
yy=1900;
mm=1;
dd=1;
}
TMyDate(int y,int m,int d)
{
yy=y;
mm=m;
dd=d;
}
int getYear(){
return yy;
}
int getMonth(){
return mm;
}
int getDay(){
return dd;
}
TMyDate operator+(int d){//日期加天数
int tmp_d=dd;
int tmp_m=mm;
int tmp_y=yy;
tmp_d+=d;
while(true){
if(tmp_d>getDaysofmonth(tmp_y,tmp_m)){
tmp_m++;
tmp_d-=getDaysofmonth(tmp_y,tmp_m);
continue;
}
if(tmp_m>12){
tmp_y++;
tmp_m-=12;
continue;
}
break;
}
return TMyDate(tmp_y,tmp_m,tmp_d);
}
TMyDate operator-(int d){//日期减天数
int tmp_d=dd;
int tmp_m=mm;
int tmp_y=yy;
tmp_d-=d;
while(true){
if(tmp_d<=0){
tmp_m--;
tmp_d+=getDaysofmonth(tmp_y,tmp_m);
continue;
}
if(tmp_m<=0){
tmp_y--;
tmp_m+=12;
continue;
}
break;
}
return TMyDate(tmp_y,tmp_m,tmp_d);
}
int operator-(TMyDate&d){//日期与日期相距天数
return getTotaldays(yy,mm,dd)-getTotaldays(d.getYear(),d.getMonth(),d.getDay());
}
void showInfo(){
cout<<yy<<'-'<<mm<<'-'<<dd<<endl;
}
};
int main()
{
TMyDate tmp1(2018,9,16);
TMyDate tmp2(1998,6,4);
TMyDate tmp3;
tmp1.showInfo();
tmp2.showInfo();
tmp3=tmp1-25;
tmp3.showInfo();
tmp3=tmp1+25;
tmp3.showInfo();
cout<<tmp1-tmp2<<endl;
tmp1.showInfo();
tmp2.showInfo();
return 0;
}
最后修改于 2018-09-16