boost完全开发指南第2章-处理时间4 (日期区间date_period)

来源:互联网 发布:分析结果与关系的算法 编辑:程序博客网 时间:2024/06/05 19:56

日期区间

#include <iostream>#include <boost/date_time/gregorian/gregorian.hpp>using namespace std;using namespace boost::gregorian;void test_date_period(){date_period dp(date(2014,1,1), days(20));        //days        cout<<"days: "<<dp.days()<<endl;       //begincout<<"begin: "<<dp.begin()<<endl;cout<<"begin day: "<<dp.begin().day()<<endl;//lastcout<<"last: "<<dp.last()<<endl;cout<<"begin day: "<<dp.last().day()<<endl;//endcout<<"end: "<<dp.end()<<endl;cout<<"end day: "<<dp.end().day()<<endl;cout<<dp<<endl;//compare two perioddate_period dp2(date(2014,2,1), days(10));bool ret = dp < dp2;cout<<"compare ret= "<<ret<<endl;}

1、date_period表示了时间轴上一个左闭右开区间,端点是date对象。区间的左值必须小于右值。否则表示一个无效的区间,用成员函数is_null()来判断是否有效。

2、date_period的成员函数shift(days(n))将日期区间平移n天而长度不变,expend(days(n))将日期区间向二端延伸n天,相当于增加了2n天。

3、date_period判断某个日期是否在区间内,或者计算日期区间的交集:

(1)is_before()/ is_after() :日期区间是否在日期前或者后;

(2)contains() : 日期区间是否包含另一个区间或者日期;

(3)intersects():二区间是否存在交集;

(4)intersection();返回二区间交集,如无交集返回一个无效区间;

(5)is_adjacent():二时间区间是否相等。

4、日期迭代器:day_iterator, week_iterator, month_iterator和 year_iterator,分别以天、周、月和年为单位增减。

void test_iterator(){//day iteratordate d(2014,1,4);day_iterator d_iter(d);++d_iter;//increase 1 dayassert(d_iter == date(2014,1,5));//year iteratoryear_iterator y_iter(*d_iter,3);//increase or decrease by 3 yearsassert(y_iter == d+days(1));++y_iter;//increase 3 yearsassert(y_iter->year() == 2017);}

注意:日期迭代器虽然支持++, ->, *等操作,但是并不符合标准迭代器标准,没有difference_type, pointer, reference等内部类型的定义,不能使用std::advance()或者operator+=来前进或者后退,例如

day_iterator d_iter(day_clock::local_day());

++d_iter;//OK

d_iter+=5;//ERROR;

std::advance(d_iter, 5);//ERROR

5、类boost::gregorian::gregorian_calender提供了格里高利历的一些操作函数,其中提供了几个有用的静态函数如is_leap_year()判断年份是否为闰年,end_of_month_day()给定年份和月份,返回该月最后一天。






0 0
原创粉丝点击