从周数和年份开始的月份

时间:2016-03-10 11:16:23

标签: c++ boost boost-date-time

让我们说: 周= 13 年= 2016

升级版或标准库中是否有任何内容可以从这两个输入中获取月份编号(或名称)。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您愿意使用免费的开源库,而不是使用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个getter。

上述链接中有完整的文档。 “date.h”和“iso_week.h”仅为标题,因此无需链接到任何其他来源。

这些计算严格遵循基于ISO周的年度here的规则。一年的第一周从前一年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(编译时计算)。 (需要比VS-2015目前支持的更多constexpr肌肉)

答案 1 :(得分: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();