假设我有:周 = 13 年 = 2016
boost 或标准库中是否有任何东西可以从这两个输入中获取月份编号(或名称)。
我知道一周可能会重叠一个多月,因此任何其他建议都会有所帮助。
谢谢!
假设我有:周 = 13 年 = 2016
boost 或标准库中是否有任何东西可以从这两个输入中获取月份编号(或名称)。
我知道一周可能会重叠一个多月,因此任何其他建议都会有所帮助。
谢谢!
如果您愿意使用非 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_y
中2015_y
具有不同的类型(date::year
和iso_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 目前支持的更多的肌肉)
#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();