0

假设我有:周 = 13 年 = 2016

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

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

谢谢!

4

2 回答 2

2

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

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

对象上有year(),month()day()吸气剂ymd

上面的链接中有完整的文档。“date.h”和“iso_week.h”只是标题,所以不需要链接到任何其他来源。

这些计算严格遵循此处概述的基于 ISO 周的年份的规则。一年的第一周从前一年 12 月最后一个星期四之后的星期一开始。这意味着有时某个日期的 ISO 年与公历年不同。例如2016_y/jan/1 == 2015_y/53_w/fri,和在这个伪代码2016_y2015_y具有不同的类型(date::yeariso_week::year),因此它们不会被意外混淆。C++ 类型系统会在编译时发现意外的歧义。

换个方向也很容易:

#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 中,如果您的输入是编译时常量,那么结果可以是constexpr(编译时计算)。(需要constexpr比 VS-2015 目前支持的更多的肌肉)

于 2016-03-10T23:44:40.470 回答
1
#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();
于 2016-03-10T13:50:27.743 回答