Boost 时间库使用 笔记
最近学习了一下boost日期时间相关的库,在此做一下学习笔记,来源于《Boost程序库完全开发指南 第4版》
思维导图
date_time库
使用方式注意点
date_time库 是需要编译才能使用
头文件
- 处理日期的头文件 gregorian
// 处理日期的组件
#include <boost/date_time/gregorian/gregorian.hpp>
using namesapce boost::gregorian;
- 处理时间的头文件 posix_time
// 处理时间的组件
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time
基本概念
-
时间是个无限延伸的实数轴,时间点是数轴上的点,两个时间点确定一个区间,时长(时间长度)是一个有正负号的标量,是两个时间点之差,不属于数轴
-
时间点、时间段和时长可以进行一定的运算,可以用常识想到 “时间点 + 时长 = 时间点” ,“时长 + 时长 = 时长”,“时间段 ∩ 时间段 = 时间段”,“时间点 ∈ 时间段” ; 还有一些无意义的运算如 “时间点+时间点”、“时长+时间段”
-
date_time 支持 无限时间和无效时间,这样特殊的时间,类似于数学上的极限。这样的 special_values 有如下几个
-
pos_infin
: 表示正无限 -
neg_infin
: 表示负无限 -
not_a_date_time
: 无效时间 -
min_date_time
: 可表示的最小日期或时间 -
max_date_time
: 可表示的最大日期或时间
日期的处理
- date_time 是日期的处理部分 ,日期只涉及 年月日。
- date_time 仅支持1400-01-01到9999-12-31之间的日期计算
date类
-
date 是date_time处理 日期的核心类,使用一个32为整数作为内部存储,以天为单位表示时间点的概念
-
类 思维导图
-
类摘要
templat<typename T, typename calendar, typename duration_type_>
class date{
public:
date(year_type,month_type,date_type); // 构造函数 如 date(2021,1,1)
date(const ymd_type &);// 其他类型的构造函数
// 基本操作函数
year_type year() const; // 获取 年
month_type month() const; // 获取 月
day_type day() const; // 获取 日
day_of_week_type day_of_week() const;// 获取 当天的星期数
ymd_type year_month_day() const;
bool operator<(const date_type &) const;
bool operator==(const date_type &) const;
// 校验函数
bool is_special() const;
bool is_not_a_date() const;
bool is_infinity() const;
bool is_pos_infinity() const;
bool is_neg_infinity() const;
// 日期运算函数
duration_type operator-(const date_tye &) const;
...
};
-
创建日期对象
-
普通构造
-
字符串构造 使用from_string() 或 from_undelimited_string()
-
day_clock
-
day_clock 是一个天级别的时钟,调用其静态成员函数local_day() 或universal_day()返回当天的日期兑现。
-
day_clock 内部使用 C标准库的localtime() 和 gmtime() 函数,所以local_day()结果依赖于操作系统的时区设置
-
非法日期的处理-采用抛出异常的方式
-
1.日期超出1400-01-01到9999-12-31的范围
-
2.使用不存在的月份或日期 如 date(2020,2,30) date(2021,13,1)
-
date_time库会抛出异常(不会转换为一个无效日期),使用what()可以获得具体错误信息
-
日期访问函数
-
date.year()
返回 年 -
date.month()
返回 月 -
date.day()
返回 日 -
year_month_day()
返回 date::ymd_type结构
-
day_of_week()
返回 date 的星期数,0表示星期天 0~6 -
day_of_year()
返回 date 是当年的第几天 最多366 -
end_of_month()
返回 当月最后一天的date -
week_number()
返回date所在周是当年的第几周 范围0~53 -
检验特殊日期的函数
-
is_infinity()
是否是一个 无限日期 -
is_neg_infinity()
是否是一个 负无限日期 -
is_pos_infinity()
是否是一个 正无限日期 -
is_not_a_date()
是否是一个无效日期 注意:非法日期没办法用这个检测出来。非法日期在构造时就会抛出异常 -
is_special()
是否是任意一个特殊日期 -
例子:
-
日期的输出
-
to_simple_string()
:YYYY-mmm-DD 其中mmm是3字符的英文月份名 -
to_iso_string()
: YYYYMMDD 都为数字 -
to_iso_extended_string()
: YYYY-MM-DD 都为数字 -
date支持 流输入输出,默认使用YYYY-mmm-DD格式
-
例子:
-
日期长度 date_duration
-
类摘要
class date_duration
{
public:
date_duration(long); //构造函数
date_duration(special_values);
long days() const; // 成员访问函数
bool is_special() const;
bool is_negative() const;
bool operator==(const date_duration &) const;
...
static date_duration unit(); // 时长单位
};
-
days
天单位时长类 -
weeks
周单位时长类 -
months
月单位时长类 -
years
年单位时长类 -
以上四个 支持加减 乘除运算
-
用法例子:
-
日期运算
-
days = date1 - date2
-
date1 = date + days(x) : x天间隔
-
date1 = date + weeks(x) : x个周间隔
-
date1 = date + months(x) : x个月间隔 注意:如果是月末日期,可能加减之后会丢失 日期。如1月31号加一个月会得到 2月28号 或 29号,再 加一个月 只能得到 3月 28号 或 29号
-
date1 = date + years(x) : x个年间隔 年也可能有月类似问题。当出现 闰年的 2月 29号
以上 x 值可以为负数
处理时间
- 时间 是 日期的进一步细化,相当于在日期“天”的量级下增加时分秒。
时间长度 time_duration
- time_duration 和 date_duration 类似。可以说是对时长单位的细化
hours
小时minutes
分seconds
秒milliseconds
毫秒microseconds
微秒nanoseconds
纳秒- 运算上 和 date_duration 运算类似
时间点 ptime
- ptime 类摘要
class ptime
{
public:
ptime(const date_type &,const time_duration_type &, dast_flags = not_dst); // 构造函数
ptime(special_values)
date_type date() const; //获取日期
time_duration_type time_of_day() const; // 获取时间
// 其他函数 与 date类 类似
};
- 创建时间点对象
- ptime(date(2021,1,1),hours(1)) // 2021年1月1号 凌晨 1时
- 实际上 时间点对象 就是 date+time_duration
- 时间运算
- ptime 除了days、weeks、months、years 增加了 hours、minutes、seconds、milliseconds...等待时长单位
- 运算上 和 date相同