如何在C ++中查找给定年份月份中的第二个星期二?

时间:2019-03-07 09:18:23

标签: c++ datetime

例如,给定2019年10月,由于2019年10月的第二个星期二是12日,所以返回12。我知道如何在Java中执行此操作。我想用C ++实现它,但是我不知道应该使用什么库。

public int date(int year) {
    LocalDate start = LocalDate.of(year, 10, 1);

    if (start.getDayOfWeek() == DayOfWeek.TUESDAY)
            return start.plusWeeks(1).getDayOfMonth();

    return start.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)).plusWeeks(1).getDayOfMonth();

}

它将返回10月的第二个星期二。

2 个答案:

答案 0 :(得分:2)

比凌乱的Java代码简单得多:

auto d = year_month_day{Tuesday[2]/October/year{y}}.day();

这使用了date库,该库及时成为了C ++ 20的标准C ++的一部分。

PS:2019年10月的第二个星期二是第8个,而不是第12个。

答案 1 :(得分:0)

如果您有权访问boost,这将变得非常容易,并且与Java代码有些相似:

#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>

auto date(const int year, const int month) {
    namespace gr = boost::gregorian;

    gr::date d{year, month, 1};

    while(d.day_of_week() != gr::Tuesday) {
        d += gr::days(1);
    }
    d += gr::weeks(1);

    return d.day();
}

int main() {
    std::cout << date(2019, 3); // second tuesday of march 2019 -> 12
}

我们首先获得一个boost::gregorian::date对象,该对象在指定月份的第一天进行了初始化,然后继续前进,直到我们没有在第一个星期二结束。之后,我们将增加一周的约会时间。最后,我们返回boost::gregorian::date::day,它代表指定日期的月份。