例如,给定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月的第二个星期二。
答案 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
,它代表指定日期的月份。