C++制作了一个week_of_eyear()函数,但不确定如何做到这一点



所以我有一些日期类,我想做一个函数,返回某个日期在一年中的周数,但经过一段时间的思考,我只是做了我认为技术上可行的事情?

int week_of_year(const Date& d)
{
int week = (int(d.month()) - 1) * 5 + ceil(d.day() / 7.0); //50

return week;
}

所以我只需将5乘以当前月份下的一个月,然后将一天除以一周相加,然后四舍五入,这似乎有效,但我似乎只是采取了简单的方法,也不是最聪明的方法,所以其他人知道我该怎么做吗?

我还为此查找了一个解决方案,因为它来自某本书的练习,我发现了这个:

Date day_one(const Date& d)
{
int year = d.year();


const int earliest_first_day = 26;
if (d.month() == Month::dec && d.day() >= earliest_first_day) {
if (int(day_of_week(d)) <= (d.day() - earliest_first_day))
++year;
}
Date d1 {year, Month::jan, 1};
while (day_of_week(d1) != Day::sun)
d1.add_day(-1);

return d1;
}
// Ex 11
int week_of_year(const Date& d)
{
Date iter{day_one(d)};
if (iter == d)
return 1;
int week = 0;
while (iter < d) {
iter.add_day(7);
++week;
}
return week;
}

但老实说,我甚至不确定这里发生了什么。。编辑:日期类

enum class Day
{
sun=0, mon, tues, wed, thurs, fri, sat
};
enum class Month {
jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
};
class Date {
int y;
Month m;
int d;
public:
Date(int y, Month m, int d);
void add_day(int n);
int year() const { return y; }
Month month() const { return m; }
int day() const { return d; }

};

实现这一点的一种方法是使用mktime

tm tms;
memset(&tms, '', sizeof(tms));
tms.tm_year = d.year() - 1900;
tms.tm_mon = d.month() - 1;
tms.tm_mday = d.day();
tms.tm_sec = 1;
tms.tm_isdst = -1;
if (mktime(&tms) == -1) throw some_error;
auto days_into_year = tms.tm_yday + 1;
return days_into_year / 7 + !!(days_into_year % 7);

您必须根据一年中第一个部分周的实际含义(即第0周或第1周(来调整代码。

最新更新