日期类问题

基本数据结构

整理关于日期的基本数据结构,在C++中,没有日期类,所以要手动构造,关于日期的数据结构。

1
2
3
4
5
struct date{
int year;
int month;
int day;
};

判断闰年

在日期中,一个重要的概念,就是闰年。
判断闰年的方法是:
年数能被4整除,但是不能被100整除,或者年数能不400整除。

1
2
3
bool is_leap_year(int year){
return (year%4==0&&(year%100!=0))||(year%400==0);
}

计算两个日期的差值

规定一个原点时间,比如(0000年01月01日),计算两个特定日期之间的差时,只需要将他们与原点的日期天数差相减。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
long calculateDays(date d){
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
long count = 0;
for (int i = 1000; i < d.year; ++i) {
count+=365;
if (is_leap_year(i))
count+=1;
}
for (int i = 1; i < d.month; ++i) {
count+=month[i-1];
}
if (is_leap_year(d.year)&&d.month>2)
count+=1;
count+=d.day;
return count;
}

上面计算了与1000年01月01日相差的天数

计算星期

给定一个日期,计算星期几。
方法是先计算出,与今天的时间差,然后用时间差与7取余数。
这里是先计算出固定日期是星期几,先前计算出,(1000年01月01日)是星期二。

1
2
3
4
string calculateWeek(date d){
string weeks[7]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
return weeks[(calculateDays(d)%7+2)%7];
}

格式化输出

日期如果通过格式化输出,需要在前面补零。

1
printf("%04d-%02d-%02d\n",d.year,d.month,d.day);