boost:date_time库——处理日期

本文详细介绍了Boost C++库中的date_time模块,包括日期类(date)的操作、特殊时间概念、日期区间处理和实用功能。通过实例演示了日期创建、成员函数应用、时长表示及日期运算,适合深入理解日期时间处理。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

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():给定年份和月份,返回该月最后一天

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值