格里高利日期系统提供了一个基于格里高利历的日期编程系统。格里高利历的首次引入是在 1582 年,用于修复儒略历中的一个错误。然而,许多地方直到很久以后才采纳这一变化。因此,历史日期可能会产生混淆。
实现的日历是“前溯格里高利历”,它将日期延伸到 1582 年格里高利历首次采用之前。当前实现支持 1400 年 1 月 1 日至 9999 年 12 月 31 日范围内的日期。许多参考文献在表示 1582 年之前的日期时会使用儒略历,因此如果需要对历史日期进行精确计算,请谨慎。有关更多详细信息,请参阅 Reingold & Dershowitz 的《Calendrical Calculations》。Calendrical Calculations 中的日期信息已被用于交叉测试格里高利历实现的正确性。
格里高利系统的所有类型都在 `boost::gregorian` 命名空间中。该库支持一个方便的头文件 `boost/date_time/gregorian/gregorian_types.hpp`,它将包含库的所有类,而无需输入/输出依赖。另一个头文件 `boost/date_time/gregorian/gregorian.hpp` 将包含类型和输入/输出代码。
`boost::gregorian::date` 类是用户的主要时间类型。如果您有兴趣了解如何编写进行专门日期计算的程序,例如查找“四月的第一个星期日”,请参阅日期 生成器和算法页面。
示例 | 描述 |
---|---|
简单的日期算术。从时钟获取当前日期。 | |
日期字符串的简单解析和格式化 | |
检查日期是否在日期周期集合中(例如:是否是节假日/周末) | |
一个小实用程序,可以从命令行打印出月份中的所有日期。想知道 1999 年 1 月 1 日是星期五还是星期六?这个程序展示了如何做到。 | |
使用日期生成器将抽象规范转换为具体的日期集合。 |
`boost::gregorian::date` 类是日期编程的主要接口。通常,`date` 类一旦构造就不可变,尽管它允许从另一个日期进行赋值。创建日期的方法包括读取 当前日期、使用 日期迭代器 以及 日期算法或生成器。
内部 `boost::gregorian::date` 存储为 32 位整数类型。该类专门设计为不包含虚函数。这种设计允许对大量日期进行高效的计算和内存使用。
日期构造会验证所有输入,因此不可能构造一个“无效”的日期。即 2001-02-29 不能被构造为一个日期。各种派生自 `std::out_of_range` 的异常将被抛出,以指示日期输入的哪个方面无效。请注意,特殊值 `not-a-date-time` 可以用作“无效”或“空”日期(如果需要)。
#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o or #include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types
语法 | 描述 |
---|---|
示例 | |
date(greg_year, greg_month, greg_day) |
按日期部分构造。如果年、月或日超出范围,则抛出 `bad_year`、`bad_day_of_month` 或 `bad_day_month`(`std::out_of_range` 的派生类)。 |
date d(2002,Jan,10); | |
date(date d) |
复制构造函数 |
date d1(d); | |
date(special_values sv) |
用于无穷大、`not-a-date-time`、`max_date_time` 和 `min_date_time` 的构造函数 |
date d1(neg_infin); date d2(pos_infin); date d3(not_a_date_time); date d4(max_date_time); date d5(min_date_time); | |
date() |
默认构造函数。创建一个初始化为 `not_a_date_time` 的日期对象。注意:此构造函数可以通过定义 `DATE_TIME_NO_DEFAULT_CONSTRUCTOR`(请参阅 `compiler_config.hpp`)来禁用。 |
date d; // d => not_a_date_time |
语法 | 描述 |
---|---|
示例 | |
date from_string(std::string) |
从分隔的日期字符串,顺序为年-月-日,例如:2002-1-25 |
std::string ds("2002/1/25"); date d(from_string(ds)); | |
date from_undelimited_string(std::string) |
从 ISO 8601 类型日期字符串,顺序为年-月-日,例如:20020125 |
std::string ds("20020125"); date d(from_undelimited_string(ds)); |
语法 | 描述 |
---|---|
示例 | |
day_clock::local_day() |
根据计算机的时区设置获取本地日期。 |
date d(day_clock::local_day()); | |
day_clock::universal_day() |
获取 UTC 日期。 |
date d(day_clock::universal_day()); |
语法 | 描述 |
---|---|
示例 | |
greg_year year() const |
获取日期的年份部分。 |
date d(2002,Jan,10); d.year(); // --> 2002 | |
greg_month month() const |
获取日期的月份部分。 |
date d(2002,Jan,10); d.month(); // --> 1 | |
greg_day day() const |
获取日期的日期部分。 |
date d(2002,Jan,10); d.day(); // --> 10 | |
greg_ymd year_month_day() const |
返回一个 `year_month_day` 结构。当需要日期的所有三个部分时更有效。 |
date d(2002,Jan,10); date::ymd_type ymd = d.year_month_day(); // ymd.year --> 2002, // ymd.month --> 1, // ymd.day --> 10 | |
greg_day_of_week day_of_week() const |
获取星期几(星期日、星期一等)。 |
date d(2002,Jan,10); d.day_of_week(); // --> Thursday | |
greg_day_of_year day_of_year() const |
获取一年中的第几天。编号从 1 到 366。 |
date d(2000,Jan,10); d.day_of_year(); // --> 10 | |
date end_of_month() const |
返回一个设置为调用对象当前月份最后一天的 `date` 对象。 |
date d(2000,Jan,10); d.end_of_month(); // --> 2000-Jan-31 | |
bool is_infinity() const |
如果日期是正无穷大或负无穷大,则返回 true。 |
date d(pos_infin); d.is_infinity(); // --> true | |
bool is_neg_infinity() const |
如果日期是负无穷大,则返回 true。 |
date d(neg_infin); d.is_neg_infinity(); // --> true | |
bool is_pos_infinity() const |
如果日期是正无穷大,则返回 true。 |
date d(pos_infin); d.is_pos_infinity(); // --> true | |
bool is_not_a_date() const |
如果值为“不是日期”,则返回 true。 |
date d(not_a_date_time); d.is_not_a_date(); // --> true | |
bool is_special() const |
如果日期是任何 `special_value`,则返回 true。 |
date d(pos_infin); date d2(not_a_date_time); date d3(2005,Mar,1); d.is_special(); // --> true d2.is_special(); // --> true d3.is_special(); // --> false | |
special_value as_special() const |
如果表示的日期是正常日期,则返回表示的 `special_value` 或 `not_special`。 |
long modjulian_day() const |
返回日期的修改儒略日。 |
long julian_day() const |
返回日期的儒略日。 |
int week_number() const |
返回日期的 ISO 8601 星期数。 |
date end_of_month() const |
返回日期的月份最后一天。 |
date d(2000,Feb,1); //gets Feb 29 -- 2000 was leap year date eom = d.end_of_month(); |
语法 | 描述 |
---|---|
示例 | |
std::string to_simple_string(date d) |
转换为 `YYYY-mmm-DD` 格式的字符串,其中 `mmm` 是 3 个字符的月份名称。 |
"2002-Jan-01" | |
std::string to_iso_string(date d) |
转换为 `YYYYMMDD` 格式的字符串,其中所有部分都是整数。 |
"20020131" | |
std::string to_iso_extended_string(date d) |
转换为 `YYYY-MM-DD` 格式的字符串,其中所有部分都是整数。 |
"2002-01-31" |
语法 | 描述 |
---|---|
示例 | |
operator<< |
流输出运算符 |
date d(2002,Jan,1); std::cout << d << std::endl; | |
operator>> |
流输入运算符。注意:从 1.33 版本开始,流操作已得到极大改进。有关异常和错误条件的详细信息,请参阅 Date Time 输入/输出系统。 |
date d(not_a_date_time); stringstream ss("2002-Jan-01"); ss >> d; | |
operator==, operator!=, operator>, operator<, operator>=, operator<= |
完整的比较运算符集。 |
d1 == d2, etc | |
date operator+(date_duration) const |
返回一个增加日期偏移量的日期。 |
date d(2002,Jan,1); date_duration dd(1); date d2 = d + dd; | |
date operator-(date_duration) const |
返回一个通过减去日期偏移量得到的日期。 |
date d(2002,Jan,1); date_duration dd(1); date d2 = d - dd; | |
date_duration operator-(date) const |
返回一个通过减去两个日期得到的 `date_duration`。 |
date d1(2002,Jan,1); date d2(2002,Jan,2); date_duration dd = d2-d1; |
提供了将 `date` 对象转换为 `tm` 结构以及从 `tm` 结构转换为 `date` 对象的函数。
语法 | 描述 |
---|---|
示例 | |
tm to_tm(date) |
一个将 `date` 对象转换为 `tm` 结构的函数。`tm_hour`、`tm_min` 和 `tm_sec` 字段设置为零。`tm_isdst` 字段设置为 -1。 |
date d(2005,Jan,1); tm d_tm = to_tm(d); /* tm_year => 105 tm_mon => 0 tm_mday => 1 tm_wday => 6 (Saturday) tm_yday => 0 tm_hour => 0 tm_min => 0 tm_sec => 0 tm_isdst => -1 */ | |
date date_from_tm(tm datetm) |
一个将 `tm` 结构转换为 `date` 对象的函数。`tm_wday`、`tm_yday`、`tm_hour`、`tm_min`、`tm_sec` 和 `tm_isdst` 字段被忽略。 |
tm d_tm; d_tm.tm_year = 105; d_tm.tm_mon = 0; d_tm.tm_mday = 1; date d = date_from_tm(d_tm); // d => 2005-Jan-01 |
`boost::gregorian::date_duration` 类是一个简单的天数计数,用于与 `gregorian::date` 进行算术运算。时长可以是正数或负数。
从 1_32 版本开始,`date_duration` 类已在 `boost::gregorian` 命名空间中被 typedef 为 `days`。在示例中,将使用 `days` 而不是 `date_duration`。
#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o or #include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types
语法 | 描述 |
---|---|
示例 | |
date_duration(long) |
创建时长计数。 |
date_duration dd(3); //3 days | |
days(special_values sv) |
用于无穷大、`not-a-date-time`、`max_date_time` 和 `min_date_time` 的构造函数 |
days dd1(neg_infin); days dd2(pos_infin); days dd3(not_a_date_time); days dd4(max_date_time); days dd5(min_date_time); |
语法 | 描述 |
---|---|
示例 | |
long days() const |
获取天数计数。 |
date_duration dd(3); dd.days() --> 3 | |
bool is_negative() const |
如果天数小于零,则为 true。 |
date_duration dd(-1); dd.is_negative() --> true | |
static date_duration unit() |
返回时长类型的最小可能单位。 |
date_duration::unit() --> date_duration(1) | |
bool is_special() const |
如果天数是任何 `special_value`,则返回 true。 |
days dd(pos_infin); days dd2(not_a_date_time); days dd3(25); dd.is_special(); // --> true dd2.is_special(); // --> true dd3.is_special(); // --> false |
语法 | 描述 |
---|---|
示例 | |
operator<<, operator>> |
流运算符。注意:从 1.33 版本开始,流操作已得到极大改进。有关异常和错误条件的详细信息,请参阅 Date Time 输入/输出系统。 |
date d(not_a_date_time); stringstream ss("2002-Jan-01"); ss >> d; std::cout << d; // "2002-Jan-01" | |
operator==, operator!=, operator>, operator<, operator>=, operator<= |
完整的比较运算符集。 |
dd1 == dd2, etc | |
date_duration operator+(date_duration) const |
添加日期时长。 |
date_duration dd1(3); date_duration dd2(5); date_duration dd3 = dd1 + dd2; | |
date_duration operator-(date_duration) const |
减去时长。 |
date_duration dd1(3); date_duration dd2(5); date_duration dd3 = dd1 - dd2; |
这些附加类型是天数跨度的逻辑表示。
语法 | 描述 |
---|---|
示例 | |
months(int num_of_months) |
逻辑月份表示。根据使用情况,此 `months` 对象可能涵盖 28 至 31 天的跨度。当与给定月份的最后一天日期结合使用时,这些对象还使用月末对齐行为。警告:此行为可能导致意外结果。有关完整详细信息和替代方法,请参阅:操作可逆性的陷阱。 |
months single(1); date leap_year(2004,Jan,31); date norm_year(2005,Jan,31); leap_year + single; // => 2004-Feb-29 norm_year + single; // => 2005-Feb-28 date(2005,Jan,1) + single; // => 2005-Feb-01 date(2005,Feb,1) + single; // => 2005-Mar-01 date(2005,Feb,28) + single; // => 2005-Mar-31 | |
years(int num_of_years) |
逻辑年份表示。`years` 对象与 `months` 对象在月末行为方面具有相同的行为。 |
years single(1); date(2003,Feb,28) + single; // results in => 2004-Feb-29 date(2004,Feb,29) + single; // results in => 2005-Feb-28 | |
weeks(int num_of_weeks) |
表示 `n * 7` 天数的时长类型。 |
weeks single(1); date(2005,Jan,1) + single; // => 2005-Jan-08 |
将一定数量的月份添加到日期,然后再减去相同数量的月份,自然期望会回到起点。这是 `date_time` 库提供结果的最常见情况,但有一个重要的例外:`months` 时长类型实现的月末对齐行为。当起始日期是 31 天月份中的第 28、29 或 30 天时,`months` 时长类型可能会提供意外的结果。`month_iterator` 不受此问题影响,因此包含在示例中以说明可能的替代方案。
当起始日期位于月份中间时,添加或减去任何数量的月份都会导致日期为相同的日期(例如,如果您从 15 日开始,您将在 15 日结束)。当日期是月份的最后一天时,添加或减去任何数量的月份都会得到一个月最后一天作为结果(例如,如果您从 1 月 31 日开始,您将到达:2 月 28 日,3 月 31 日等)。
// using months duration type date d(2005, Nov, 30); // last day of November d + months(1); // result is last day of December "2005-Dec-31" d - months(1); // result is last day of October "2005-Oct-31" // using month_iterator month_iterator itr(d); // last day of November ++itr; // result is last day of December "2005-Dec-31" --itr; // back to original starting point "2005-Nov-30" --itr; // last day of October "2005-Oct-31"
如果起始日期是 31 天月份中的第 28、29 或 30 天,添加或减去一个月份的结果可能会意外触发月末对齐行为。这将导致最终结果与起始日期不同。
// using months duration type date d(2005, Nov, 29); d += months(1); // "2005-Dec-29" d += months(1); // "2006-Jan-29" d += months(1); // "2006-Feb-28" --> snap-to-end-of-month behavior kicks in d += months(1); // "2006-Mar-31" --> unexpected result d -= months(4); // "2005-Nov-30" --> unexpected result, not where we started // using month_iterator month_iterator itr(date(2005, Dec, 30)); ++itr; // "2006-Jan-30" --> ok ++itr; // "2006-Feb-28" --> snap-to DOES NOT kick in ++itr; // "2006-Mar-30" --> ok --itr; // "2006-Feb-28" --> ok --itr; // "2006-Jan-30" --> ok --itr; // "2005-Dec-30" --> ok, back where we started
附加时长类型(`months`、`years` 和 `weeks`)作为便利提供,可以轻松移除以确保此陷阱永远不会发生。要移除这些类型,只需取消定义 `BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES`。
`boost::gregorian::date_period` 类提供了两个日期之间范围的直接表示。周期可以通过简化程序条件逻辑来简化某些类型的计算。例如,使用日期周期集合可以测试一个日期是否在不规则的时间表内,如周末或节假日。这通过几种方法实现,这些方法允许评估一个 `date_period` 是否与另一个 `date_period` 相交,并生成相交产生的周期。 日期周期计算示例 提供了这方面的例子。
以开始和结束点相等或持续时间为零创建的周期称为零长度周期。零长度周期被视为无效(构造一个无效周期是完全合法的)。对于这些周期,`last` 点将始终比 `begin` 点小一个单位。
与无穷大值结合使用的日期周期能够表示“无限期”等复杂概念。
#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o or #include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types
语法 | 描述 |
---|---|
示例 | |
date_period(date, date) |
创建周期为 [begin, end)。如果 end <= begin,则周期无效。 |
date_period dp(date(2002,Jan,10), date(2002,Jan,12)); | |
date_period(date, days) |
创建周期为 [begin, begin+len),其中结束点为 begin+len。如果 len <= zero,则周期被定义为无效。 |
date_period dp(date(2002,Jan,10), days(2)); | |
date_period(date_period) |
复制构造函数 |
date_period dp1(dp); |
语法 | 描述 |
---|---|
示例 | |
date_period shift(days) |
向 begin 和 end 添加持续时间。 |
date_period dp(date(2005,Jan,1), days(3)); dp.shift(days(3)); // dp == 2005-Jan-04 to 2005-Jan-07 | |
date_period expand(days) |
从 begin 减去 duration 并向 end 添加 duration。 |
date_period dp(date(2005,Jan,2), days(2)); dp.expand(days(1)); // dp == 2005-Jan-01 to 2005-Jan-04 |
语法 | 描述 |
---|---|
示例 | |
date begin() |
返回周期的第一天。 |
date_period dp(date(2002,Jan,1), date(2002,Jan,10)); dp.begin() --> 2002-Jan-01 | |
date last() |
返回周期中的最后一天。 |
date_period dp(date(2002,Jan,1), date(2002,Jan,10)); dp.last() --> 2002-Jan-09 | |
date end() |
返回周期最后一个点之后的一个点。 |
date_period dp(date(2002,Jan,1), date(2002,Jan,10)); dp.end() --> 2002-Jan-10 | |
days length() |
返回 `date_period` 的长度。 |
date_period dp(date(2002,Jan,1), days(2)); dp.length() --> 2 | |
bool is_null() |
如果周期格式不正确,则为 true。例如:end 小于或等于 begin。 |
date_period dp(date(2002,Jan,10), date(2002,Jan,1)); dp.is_null() --> true | |
bool contains(date) |
如果日期在周期内,则为 true。零长度周期不能包含任何点。 |
date d(2002,Jan,1); date_period dp(d, date(2002,Jan,10)); dp.contains(date(2002,Jan,2));// true date_period dp2(d, d); dp.contains(date(2002,Jan,1));// false | |
bool contains(date_period) |
如果日期周期在周期内,则为 true。 |
date_period dp1(date(2002,Jan,1), date(2002,Jan,10)); date_period dp2(date(2002,Jan,2), date(2002,Jan,3)); dp1.contains(dp2) --> true dp2.contains(dp1) --> false | |
bool intersects(date_period) |
如果周期重叠,则返回 true。 |
date_period dp1(date(2002,Jan,1), date(2002,Jan,10)); date_period dp2(date(2002,Jan,2), date(2002,Jan,3)); dp2.intersects(dp1) --> true | |
date_period intersection(date_period) |
计算两个周期的交集。如果没有交集,则为 Null。 |
date_period dp1(date(2002,Jan,1), date(2002,Jan,10)); date_period dp2(date(2002,Jan,2), date(2002,Jan,3)); dp2.intersection(dp1) --> dp2 | |
date_period is_adjacent(date_period) |
检查两个周期是否相邻但未重叠。 |
date_period dp1(date(2002,Jan,1), date(2002,Jan,3)); date_period dp2(date(2002,Jan,3), date(2002,Jan,10)); dp2.is_adjacent(dp1) --> true | |
date_period is_after(date) |
确定周期是否在给定日期之后。 |
date_period dp1(date(2002,Jan,10), date(2002,Jan,30)); date d(2002,Jan,3); dp1.is_after(d) --> true | |
date_period is_before(date) |
确定周期是否在给定日期之前。 |
date_period dp1(date(2002,Jan,1), date(2002,Jan,3)); date d(2002,Jan,10); dp1.is_before(d) --> true | |
date_period merge(date_period) |
返回两个周期的并集。如果没有交集,则为 Null。 |
date_period dp1(date(2002,Jan,1), date(2002,Jan,10)); date_period dp2(date(2002,Jan,9), date(2002,Jan,31)); dp2.merge(dp1) // 2002-Jan-01/2002-Jan-31 | |
date_period span(date_period) |
组合两个周期以及它们之间的任何间隙,使得 begin = min(p1.begin, p2.begin) 且 end = max(p1.end , p2.end)。 |
date_period dp1(date(2002,Jan,1), date(2002,Jan,5)); date_period dp2(date(2002,Jan,9), date(2002,Jan,31)); dp2.span(dp1); // 2002-Jan-01/2002-Jan-31 | |
date_period shift(days) |
向 begin 和 end 添加持续时间。 |
date_period dp1(date(2002,Jan,1), date(2002,Jan,10)); dp1.shift(days(1)); // 2002-Jan-02/2002-Jan-11 | |
date_period expand(days) |
从 begin 减去 duration 并向 end 添加 duration。 |
date_period dp1(date(2002,Jan,4), date(2002,Jan,10)); dp1.expand(days(2)); // 2002-Jan-02/2002-Jan-12 |
语法 | 描述 |
---|---|
示例 | |
std::string to_simple_string(date_period dp) |
转换为 `[YYYY-mmm-DD/YYYY-mmm-DD]` 格式的字符串,其中 `mmm` 是 3 个字符的月份名称。 |
[2002-Jan-01/2002-Jan-31] |
语法 | 描述 |
---|---|
示例 | |
operator<< |
用于 `date_period` 的 ostream 运算符。使用 facet 来格式化时间点。典型输出:[2002-Jan-01/2002-Jan-31]。 |
std::cout << dp << std::endl; | |
operator>> |
用于 `date_period` 的 istream 运算符。使用 facet 来解析时间点。 |
"[2002-Jan-01/2002-Jan-31]" | |
operator==, operator!=, operator>, operator< |
完整的比较运算符集。 |
dp1 == dp2, etc | |
operator< |
如果 dp1.end() 小于 dp2.begin(),则为 true。 |
dp1 < dp2, etc | |
operator> |
如果 dp1.begin() 大于 dp2.end(),则为 true。 |
dp1 > dp2, etc |
日期迭代器提供了一个标准机制来迭代日期。日期迭代器是 双向迭代器 的模型,可用于将日期填充到集合以及其他日期生成任务。例如,打印月份 示例会迭代月份中的所有日期并打印它们。
这里的所有迭代器都派生自 `boost::gregorian::date_iterator`。
#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o or #include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types
语法 | 描述 |
---|---|
示例 | |
date_iterator |
所有日期级别迭代器的通用(抽象)基类。 |
day_iterator(date start_date, int day_count=1) |
以 `day_count` 天为步长进行迭代。此迭代器不提供后缀递增/递减运算符。仅提供前缀运算符。 |
day_iterator day_itr(date(2005,Jan,1)); ++d_itr; // 2005-Jan-02 day_iterator 2day_itr(date(2005,Feb,1),2); ++2d_itr; // 2005-Feb-03 | |
week_iterator(...) Parameters: date start_date int week_offset (defaults to 1) |
以 `week_offset` 周为步长进行迭代。此迭代器不提供后缀递增/递减运算符。仅提供前缀运算符。 |
week_iterator wk_itr(date(2005,Jan,1)); ++wk_itr; // 2005-Jan-08 week_iterator 2wk_itr(date(2005,Jan,1),2); ++2wk_itr; // 2005-Feb-15 | |
month_iterator(...) Parameters: date start_date int month_offset (defaults to 1) |
以 `month_offset` 月为步长进行迭代。处理月末有特殊规则。规则是:如果起始日期是月末,则始终调整到月末。如果日期超出月末(例如 1 月 31 日 + 1 个月),则调整回月末(有关此问题的更多详细信息和示例,请参阅 操作可逆性的陷阱。注意: `month_iterator` 不受此陷阱影响。)此迭代器不提供后缀递增/递减运算符。仅提供前缀运算符。 |
month_iterator m_itr(date(2005,Jan,1)); ++m_itr; // 2005-Feb-01 month_iterator 2m_itr(date(2005,Feb,1),2); ++2m_itr; // 2005-Apr-01 | |
year_iterator(...) Parameters: date start_date int year_offset (defaults to 1) |
以 `year_offset` 年为步长进行迭代。`year_iterator` 始终落在给定日期参数的日期上,除非日期是闰年中的 2 月 28 日。在这种情况下,迭代器将返回闰年的 2 月 29 日(例如:2003-02-28、2004-02-29、2005-02-28)。此迭代器不提供后缀递增/递减运算符。仅提供前缀运算符。 |
year_iterator y_itr(date(2005,Jan,1)); ++y_itr; // 2006-Jan-01 year_iterator 2y_itr(date(2005,Feb,1),2); ++2y_itr; // 2007-Feb-01 |
日期算法或生成器是用于生成其他日期或日期计划的工具。生成器函数以日期的某个部分(如月份和日期)开始,并提供另一部分以生成具体日期。这使得程序员能够表示“二月的第一个星期日”等概念,然后在提供一个或多个年份时生成具体的日期集合。注意:自 boost 版本 1_31_0 起,日期生成器名称已更改。旧名称仍然可用,但不再记录,并可能在将来被弃用。
还提供了独立的函数来生成日期或计算天数。这些函数将日期对象和星期几对象作为参数。
所有日期生成器类和函数都在 `boost::gregorian` 命名空间中。
打印节假日 示例显示了详细的用法示例。
#include "boost/date_time/gregorian/gregorian.hpp"
类和 `get_date` 参数 | 描述 |
---|---|
示例 | |
year_based_generator date get_date(greg_year year) |
一个统一的(抽象)`date_generator` 基类型,用于:`partial_date`、`nth_day_of_the_week_in_month`、`first_day_of_the_week_in_month` 和 `last_day_of_the_week_in_month`。 |
打印节假日 示例显示了详细的用法示例。 | |
last_day_of_the_week_in_month(greg_weekday, greg_month) date get_date(greg_year year) |
计算例如一月的最后一个星期一。 |
last_day_of_the_week_in_month lwdm(Monday,Jan); date d = lwdm.get_date(2002); //2002-Jan-28 | |
first_day_of_the_week_in_month(greg_weekday, greg_month) date get_date(greg_year year) |
计算例如一月第一个星期一。 |
first_day_of_the_week_in_month fdm(Monday,Jan); date d = fdm.get_date(2002); //2002-Jan-07 | |
nth_day_of_the_week_in_month(week_num, greg_weekday, greg_month) date get_date(greg_year year) |
`week_num` 是 `nth_day_of_the_week_in_month` 的公共枚举成员。计算例如一月第一个星期一、三月第二个星期二、十二月第三个星期日等(提供第一至第五,第五相当于最后一个)。 |
typedef nth_day_of_the_week_in_month nth_dow; nth_dow ndm(nth_dow::third, Monday,Jan); date d = ndm.get_date(2002); //2002-Jan-21 | |
partial_date(greg_day, greg_month) date get_date(greg_year year) |
通过将年份应用于给定的月份和日期来生成日期。 |
partial_date pd(1,Jan); date d = pd.get_date(2002); //2002-Jan-01 | |
first_day_of_the_week_after(greg_weekday) date get_date(date d) |
计算例如 2002 年 1 月 1 日之后的第一个星期日。 |
first_day_of_the_week_after fdaf(Monday); date d = fdaf.get_date(date(2002,Jan,1)); //2002-Jan-07 | |
first_day_of_the_week_before(greg_weekday) date get_date(date d) |
计算例如 2002 年 2 月 1 日之前的第一个星期一。 |
first_day_of_the_week_before fdbf(Monday); date d = fdbf.get_date(date(2002,Feb,1)); //2002-Jan-28 |
函数原型 | 描述 |
---|---|
示例 | |
days days_until_weekday date, greg_weekday) |
计算从给定日期到给定星期几的天数。 |
date d(2004,Jun,1); // Tuesday greg_weekday gw(Friday); days_until_weekday(d, gw); // 3 days | |
days days_before_weekday(date, greg_weekday) |
计算从给定日期到前一个给定星期几的天数。 |
date d(2004,Jun,1); // Tuesday greg_weekday gw(Friday); days_before_weekday(d, gw); // 4 days | |
date next_weekday(date, greg_weekday) |
生成一个表示给定日期之后星期几的日期对象。可以返回给定日期。 |
date d(2004,Jun,1); // Tuesday greg_weekday gw1(Friday); greg_weekday gw2(Tuesday); next_weekday(d, gw1); // 2004-Jun-4 next_weekday(d, gw2); // 2004-Jun-1 | |
date previous_weekday(date, greg_weekday) |
生成一个表示给定日期之前的星期几的日期对象。可以返回给定日期。 |
date d(2004,Jun,1); // Tuesday greg_weekday gw1(Friday); greg_weekday gw2(Tuesday); previous_weekday(d, gw1); // 2004-May-28 previous_weekday(d, gw2); // 2004-Jun-1 |
`boost::gregorian::gregorian_calendar` 类实现了创建格里高利日期系统所需的功能。它将日期从年-月-日形式转换为天数表示,反之亦然。
对于大多数用途,这个类只是通过 gregorian::date 访问,用户不直接使用它。但是,有一些有用的函数可能很有用,例如 `end_of_month_day` 函数。
打印月份 示例演示了这一点。
#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o or #include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types
语法 | 描述 |
---|---|
示例 | |
static short day_of_week(ymd_type) |
返回星期几(0==星期日,1==星期一,等等)。 |
另请参阅 gregorian::date 的 `day_of_week`。 | |
static date_int_type day_number(ymd_type) |
将 `ymd_type` 转换为天数。天数映射是实现定义的,但库实现了 1400-01-01 的纪元,如下所示。date(gregorian_calendar::epoch()).day_number() == 2232400 |
static short end_of_month_day(year_type, month_type) |
给定年份和月份,确定该月的最后一天。 |
static ymd_type from_day_number(date_int_type) |
将天数转换为 `ymd` 结构。 |
static bool is_leap_year(year_type) |
如果指定的年份是闰年,则返回 true。 |
gregorian_calendar::is_leap_year(2000) //--> true |