Boost C++ 库

世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

公历 - Boost C++ 函数库
PrevUpHomeNext

格里高利历

格里高利日期系统

简介 -- 用法示例

简介

格里高利日期系统提供了一个基于格里高利历的日期编程系统。格里高利历的首次引入是在 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 日是星期五还是星期六?这个程序展示了如何做到。
使用日期生成器将抽象规范转换为具体的日期集合。

日期

简介 -- 头文件 -- 构造 -- 从字符串构造 -- 从时钟构造 -- 访问器 -- 转换为字符串 -- 运算符 -- struct tm 函数

简介

`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;

struct tm 函数

提供了将 `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

PrevUpHomeNext