从周数和年份开始的月份
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_y
和2015_y
有不同的类型(date::year
和iso_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
肌肉)
假设我有: 周 = 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_y
和2015_y
有不同的类型(date::year
和iso_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
肌肉)