日期区间
#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;
//begin
cout<<"begin: "<<dp.begin()<<endl;
cout<<"begin day: "<<dp.begin().day()<<endl;
//last
cout<<"last: "<<dp.last()<<endl;
cout<<"begin day: "<<dp.last().day()<<endl;
//end
cout<<"end: "<<dp.end()<<endl;
cout<<"end day: "<<dp.end().day()<<endl;
cout<<dp<<endl;
//compare two period
date_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 iterator
date d(2014,1,4);
day_iterator d_iter(d);
++d_iter;//increase 1 day
assert(d_iter == date(2014,1,5));
//year iterator
year_iterator y_iter(*d_iter,3);//increase or decrease by 3 years
assert(y_iter == d+days(1));
++y_iter;//increase 3 years
assert(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()给定年份和月份,返回该月最后一天。