从周数和年份开始的月份

Month from week number and year

假设我有: 周 = 13 年份 = 2016

boost 或标准库中是否有任何东西可以从这两个输入中获取月份编号(或名称)。

我知道一周可能会跨越一个多月,因此任何其他建议都会有所帮助。

谢谢!

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

using namespace boost::gregorian;

// Initialize variables with some values
int week_nmb = 13, year = 2017;

date d = date(year, Jan, 1) + weeks(week_nmb);

int month = d.month();

如果您愿意使用非 boost 且使用 C++11 或更高版本的免费 open-source 库,请查看:

https://github.com/HowardHinnant/date

示例代码:

#include "date.h"
#include "iso_week.h"
#include <iostream>

int
main()
{
    using namespace iso_week::literals;
    auto ymd = date::year_month_day{2016_y/13_w/mon};
    std::cout << ymd << '\n';
}

这输出:

2016-03-28

ymd object.

上有 year()month()day() getter

上面有完整的文档 link。 "date.h" 和 "iso_week.h" 只是 header,因此不需要 link 任何其他来源。

这些计算严格遵循概述的 ISO week-based 年 here 的规则。一年的第一周从上一年 12 月的最后一个星期四之后的星期一开始。这意味着有时日期的 ISO-year 与公历年份不同。例如2016_y/jan/1 == 2015_y/53_w/fri,而在这个pseudo-code中,2016_y2015_y有不同的类型(date::yeariso_week::year),所以他们不能不小心混淆. C++ 类型系统会在 compile-time.

处发现意外的歧义

换个方向也很容易:

#include "date.h"
#include "iso_week.h"
#include <iostream>

int
main()
{
    using namespace date::literals;
    auto iso = iso_week::year_weeknum_weekday{2016_y/mar/28};
    std::cout << iso << '\n';
}

输出:

2016-W13-Mon

在 C++14 中,如果您的输入是 compile-time 常量,则结果可以是 constexpr(compile-time 计算)。 (需要比 VS-2015 当前支持更多的 constexpr 肌肉)