如何在C++中找到给定年份中一个月的第二个星期二?
How to find the second Tuesday in a month of a given year in C++?
例如,给定 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日。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '