1.date_time
它是一个非常全面且灵活的日期时间库,基于我们日常使用的公历,可以提供时间相关的各种所需功能,如精确定义的时间点、时间段和时间长度、加减若干天/月/年、日期迭代器等等,date_time库还支持无限时间和无效时间这种实际生活中有用的概念,而且还可以与C的传统时间结构tm相互转换,提供向下支持。
date_time库需要编译才能使用,编译方法。
date_time库包含两个部分,分别是处理日期的gregorian和处理时间的posix_time。
date_time库中用枚举special_values定义了这些特殊的时间概念,它位于名字空间boost::date_time。
pos_infin //表示正无限
neg_infin //表示负无限
not_a_date_time //无效时间
min_date_time //可表示的最小日期或时间
max_date_time //可表示的最大日期或时间
①日期
date是date_time库处理日期的核心类,使用一个32位的整数作为内部存储,以天为单位表示时间点概念。
date是一个轻量级的对象,很小,处理效率很高,可以被拷贝传值,也全面支持比较操作和流输入输出。
//包含头文件
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;
//创建日期的几种方式
date d1;
date d2(2010, 1, 1);
date d3(2000, Jan, 1);
date d4(d2);
//如果日期超过最大值或者小于最小值,则抛出异常
date dd1(neg_infin); //负无限日期
date dd2(pos_infin); //正无限日期
date dd3(not_a_date_time); //无效日期
date dd4(max_date_time); //最大可能日期9999-12-31
date dd5(min_date_time); //最小可能日期1400-01-01
//做比较
assert(d1 == date(not_a_date_time));
assert(d2 == d4);
assert(d3 < d4);
//date也可以从一个字符串产生。
date d5 = from_string("1999-12-31");
date d6(from_string("2015/1/1"));
date d7 = from_undelimited_string("20011118");
//一些常用成员函数
date d(2014,4,1);
d.year();
d.month();
d.day();
d.day_of_week(); //返回date的星期数,0表示星期天
d.day_of_year(); //返回当年的第几天(最多366)
d.end_of_month(); //返回当月的最后一天date对象。
d.week_number(); //返回date所在的周是当年的第几周。
//检验日期的特殊方法
is_infinity(); //是否是一个无限日期
is_neg_infinity(); //是否是一个负无限日期
is_pos_infinity(); //是否是一个正无限日期
is_not_a_date(); //是否是一个无效日期
is_special(); //是否是任意一个特殊日期
用法:
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace std;
using namespace boost;
using namespace boost::gregorian;
int main()
{
date d(2020, 2, 22);
//转换为YYYY-mmm-DD格式的字符串,mmm为3字符英文月份名。
cout << to_simple_string(d) << endl;
//转换为YYYYMMDD格式
cout << to_iso_string(d) << endl;
//转换为YYYY-MM-DD格式
cout << to_iso_extended_string(d) << endl;
getchar();
return 0;
}
运行截图:
②日期长度
日期长度是以天为单位的时长,是度量时间长度的一个标量。它与日期不同,值可以是任意的整数,可正可负。
用类date_duration表示。
date_time库为date_duration定义了一个常用的typedef:days。
为了方便计算长度,date_time库还提供了months、years、weeks等另外三个时长类,分别用来表示月、年和星期,它们的含义与days类似,但行为不太相同。
weeks w(3); //3个星期
months m(5); //5个月
years y(2); //2年
months m2 = y + m; //2年零5个月
③日期区间
date_period类表示日期区间,它是时间轴上的一个左闭右开区间,端点是两个date对象。区间的左边界必须小于右边界,否则将表示一个无效的日期区间。
date_period dp1(date(2014,1,1),days(20));
date_period dp1(date(2014,1,1),date(2013,1,1)); //无效
//常用方法
dp1.begin(); dp1.last(); //返回日期区间两个端点
dp1.end(); //返回last()后的第一天。
dp1.length(); //返回日期区间的长度,以天为单位。
//区间价运算
dp1.shift(days(3)); //将日期区间平移n天而长度不变
dp1.expand(days(3)); //将日期区间向两端延伸n天,相当于区间长度加2n天
④日期迭代器
可以用简单的递增或者递减操作符连续访问日期,这些迭代器包括
day_iterator、week_iterator、month_iterator、year_iterator。
日期迭代器的用法基本类似,都需要在构造时传入一个起始日期和增减步长(可以是一天、两周、N个月,默认是一个单位)。然后用operator++、operator--变化日期,迭代器相当于一个date对象的指针,可以用解引用操作符 * 获得迭代器当前的日期对象,也可以用 -> 直接调用日期对象的成员函数。
date d(2016,11,26);
day_iterator d_iter(d); //默认步长为1天
++d_iter; //递增1天,只有后置式,没有前置式
year_iterator y_iter(*d_iter,8); //增减步长为8年
++y_iter; //递增8年,只有后置式,没有前置式
虽然day_iterator、week_iterator的名字叫 迭代器,但是它不符合标准迭代器的定义,不能使用operator+=来前进或者后退。
date d(2016,11,26);
day_iterator d_iter(d); //默认步长为1天
++d_iter; //递增1天,只有后置式,没有前置式
d_iter += 5; //错误