Boost库基础-日期

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;                   //错误

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章