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

How to find the second Tuesday in a month of a given year in C++?

本文关键字:一个 星期二 第二个 C++      更新时间:2023-10-16

例如,给定 2019 年 10 月,返回 12,因为 2019 年 10 月的第二个星期二是 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 月的第二个星期二返回。

如果您可以访问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,它表示指定日期的月份中的某一天。

比那些乱七八糟的Java代码简单得多:

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

这将使用日期库,该日期库在 C++20 之前及时成为标准C++的一部分。

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