date_time 库包含两部分,分别是处理日期的 gregorian 和处理时间的 posix_time。
date_time 库的日期基于格里高利历,支持从 1400-01-01 到 9999-12-31之间的日期计算。
一、特殊的时间概念
date_time 库的 special_values 枚举定义了特殊时间的概念:
- pos_infin:正无限
- neg_infin:负无限
- no_a_date_time:无效时间
- min_date_time:可表示的最小日期或时间
- max_date_time:可表示的最大日期或时间
二、date类
date 是 date_time库处理日期的核心类。使用32位整数作为内部储存,以天为单位表示时间的概念,是非常轻量级的对象,处理效率很高,因此完全可以把它当做int这样的基本类型来处理。
2.1、创建对象
创建 date 对象有多种方式:
#include <QDebug>
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;
int main()
{
date d1;//一个无效的日期
qDebug()<< (d1 == date(not_a_date_time));//比较一个临时对象
date d2(2022,10,10);
date d3(2002,Jan,1);
date d4(d3);
qDebug()<< (d3 == d4);
qDebug()<< (d3 < d4);
date d5 = from_string("1991-12-31");
date d6(from_string("2020/1/1"));
date d7 = from_undelimited_string("20220809");
date d8 = day_clock::local_day();//本地日期
std::cout<<d8<<std::endl;
date d9 = day_clock::universal_day();//UTC日期
std::cout<<d9<<std::endl;
std::cout<<date(neg_infin)<<std::endl;
std::cout<<date(pos_infin)<<std::endl;
std::cout<<date(not_a_date_time)<<std::endl;
std::cout<<date(max_date_time)<<std::endl;
std::cout<<date(min_date_time)<<std::endl;
}
创建理论上不存在的日期(如32日)和超过上下限的日期都会抛出异常,如:
std::cout<<date(1000,1,1)<<std::endl;
2.2、成员函数
1、year()、month()、day()
分别返回日期的年、月、日。
2、year_month_day()
一次性获取年月日数据:
date::ymd_type ymd = d8.year_month_day(); qDebug()<<ymd.year; qDebug()<<ymd.month; qDebug()<<ymd.day;
3、day_of_week()
返回日期的星期数。0是星期天。
4、day_of_year()
返回日期是一年的第几天。
5、end_of_month()
返回当月的最后一天的 date 对象。
6、week_number()
日期所在的周是当年的第几周。范围是 0 ~ 53。
6、是否特殊日期
- is_infinity();
- is_neg_infinity();
- is_not_a_date();
- is_pos_infinity();
- is_special()
三、输出日期
//转换为YYYY-mmm-DD格式的字符串,mmm为3字符的英文月份名称
std::cout<<to_simple_string(d8)<<std::endl;
//转换为YYYYMMDD格式的数字字符串
std::cout<<to_iso_string(d8)<<std::endl;
//转换为YYYY-MM-DD格式的数字字符串
std::cout<<to_iso_extended_string(d8)<<std::endl;

四、表示时长的类
- date_duration:以天为单位的时长。
- months:以月为单位的时长。
- years:以年为单位的时长。
- weeks:以星期为单位的时长。
weeks w(3);//3个星期
std::cout<<(w.days() == 21);
months m(5);//5个月
years y(2);//2年
months m2 = y + m;//2年零5个月
五、日期运算
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;
int main()
{
date d1(2022,10,10);
date d2(2026,1,23);
std::cout<<"两日期之差"<<d2-d1<<"天"<<std::endl;
d1 += days(10);
d1 += months(2);
d1 -= weeks(1);
}
六、日期区间
date_time 库使用 date_period 类表示日期区间的概念,它是时间轴上的一个左闭右开的区间,端点是两个 date 对象。区间的左边界必须小于右边界,否则将是一个无效的区间。
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;
int main()
{
date d1(2022,10,10);
date d2(2026,1,23);
date_period dp(d1,d2);
std::cout<<dp<<std::endl;
}
6.1、成员函数
1、begin()、last()
返回日期区间的两个端点。
2、end()
返回 last() 后的第一天。
3、length()
返回日期区间的长度。
4、is_null()
是否无效的日期区间。
5、shift()
将日期区间平移n天,而长度不变。
6、expand()
将日期区间向两端延伸n天,即长度加2n天。
7、is_before()、is_after()
日期区间是否在某日期前面、后面。
8、contains()
日期区间是否包含另一个区间或日期。
9、intersects()
两个日期区间是否有交集。
10、intersection()
返回两个区间的交集,若无交集则返回一个无效的区间。
11、is_adjacent()
两个日期区间是否相邻。
12、merge()
返回两个区间的并集,若区间无交集或不相邻则返回无效区间。
13、span()
合并两个日期区间即区间的间隔。
七、日期迭代器
date_time 库为日期处理提供了迭代器的概念,可以用简单的递增或递减操作符连续访问日期,包括:
- day_iterator
- week_iterator
- month_iterator
- year_iterator
它们分别以天、周、月、年为单位增减。
这些迭代器用法类似,在构造时传入一个起始日期和一个增减步长。
迭代器相当于一个对象指针,可以用 * 获取当前的日期对象,也可以用->直接调用日期对象的成员函数。
日期迭代器重载了比较操作符,不需要解引用操作就可以直接与其他日期对象作比较。
处于性能的考虑,日期迭代器只提供前置式的++、--运算符,不提供后置式的。
date d(2007,9,28);
day_iterator d_iter(d,7);
++d_iter;
std::cout<<*d_iter<<std::endl;//2007-Oct-05
year_iterator y_iter(*d_iter, 10);
++y_iter;
std::cout<<*y_iter<<std::endl;//2017-Oct-05
八、一些实用功能
- boost::gregorian::gregorian_calendar::is_leap_year():某年是否闰年
- boost::gregorian::gregorian_calendar::end_of_month_day():给定年份和月份,返回该月最后一天
本文详细介绍了Boost C++库中的date_time模块,包括日期类(date)的操作、特殊时间概念、日期区间处理和实用功能。通过实例演示了日期创建、成员函数应用、时长表示及日期运算,适合深入理解日期时间处理。
4839

被折叠的 条评论
为什么被折叠?



