首页 > 解决方案 > C++ 制作 week_of_year() 函数不确定如何执行此操作

问题描述

所以我有一些日期类,我想创建一个函数来返回某个日期在一年中的多少周,但就像在考虑了一下之后我刚刚做了我认为在技术上可行的?

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; }
    
};

标签: c++

解决方案


实现此目的的一种方法是使用mktime.

    tm tms;
    memset(&tms, '\0', 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 周)来调整代码。


推荐阅读