Boost之date_time

Boost.Date_Time库是一个功能丰富的时间日期处理库,它提供了多种用于日期和时间计算、格式化、转换和输入输出的功能。以下是该库的一些详细介绍:

1、日期处理

  • Boost.Date_Time库中的date类基于格里高利历(Gregorian calendar),支持从1400年1月1日到9999年12月31日的日期计算。
  • 使用<boost/date_time/gregorian/gregorian.hpp>头文件可以处理日期相关的操作,如获取当前日期、日期的加减运算等。

2、时间处理

  • posix_time是处理时间的类,使用<boost/date_time/posix_time/posix_time.hpp>头文件,可以表示时间点,并支持时间的加减运算等操作。
  • 时间长度可以通过date_duration类来表示,它允许进行时间的间隔计算,如两个时间点之间的差值等。

3、时间点

  • ptime类结合了日期和时间,可以用来表示具体的时间点,例如某一天的某个时刻。

4、时间格式化与解析

  • 库中提供了时间和日期的格式化和解析功能,可以将时间日期对象转换为字符串,或者从字符串中解析出时间日期对象。

5、时间间隔

  • date_duration类用于表示时间间隔,可以进行时间间隔的加减运算,以及与其他时间间隔的比较等操作。

时间库中的一些概念:

  1. date:这是基于格里高利历的日期类,它支持从1400年1月1日到9999年12月31日之间的日期计算。使用这个类,可以进行日期的加减、比较等操作。要使用date类,需要包含头文件<boost/date_time/gregorian/gregorian.hpp>
  2. ptime:这是一个结合了日期和时间的时间点类,它可以用来表示具体的时间点,例如某一天的某个时刻。ptime类非常适合用于记录事件发生的具体时间,或者进行时间点的计算和比较。
  3. date_period:这是一个表示日期区间的类,它可以用来表示一段时间范围,比如“2023年的整个夏天”或者“去年的前三个月”。date_period类可以用于执行如迭代这段时间内每一天的操作。
  4. date_durationdate_duration用来表示一段时间的长度,它独立于任何特定的时间点,只包含时间的长度信息。它可以用来表示天、小时、分钟或秒等多种不同的时间单位,并支持这些单位之间的转换。通过date_duration可以方便地对时间进行加减,也可以计算两个时间长度的总和或差值

代码示例:

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time.hpp>
#include <iostream>
#include <sstream>
using namespace std;
using namespace boost;
using namespace boost::date_time;

string to_string(posix_time::ptime t){
    stringstream ss;
    ss.fill('0');
    ss << t.date().year() << "-" 
        << setw(2) << t.date().month().as_number() << "-" 
        << setw(2) << t.date().day().as_number() << " " 
        << setw(2) << t.time_of_day().hours() << ":" 
        << setw(2) << t.time_of_day().minutes() << ":" 
        << setw(2) << t.time_of_day().seconds() << "." 
        << setw(6) << t.time_of_day().fractional_seconds();
    return ss.str();
}

string to_string(posix_time::time_period tp){
    ostringstream os;
    os << to_string(tp.begin()) << "<-->" << to_string(tp.end());
    return os.str();
}

int main(){
    //字符串转时间
    posix_time::ptime t1 = posix_time::time_from_string("2024-03-05 02:03:04.009");  //1400至9999年
    posix_time::ptime t2 = posix_time::from_iso_extended_string("2024-03-05T02:03:04.005678");
    posix_time::ptime t3 = posix_time::from_iso_string("20240305T020304.045678");
    auto t4 = posix_time::second_clock::local_time();
    auto t5 = posix_time::microsec_clock::local_time();
    auto t6 = posix_time::second_clock::universal_time();
    auto t7 = posix_time::microsec_clock::universal_time();
    auto t8 = posix_time::from_time_t(time(0));
    cout << to_string(t1) << endl;
    cout << to_string(t2) << endl;
    cout << to_string(t3) << endl;
    cout << to_string(t4) << endl;
    cout << to_string(t5) << endl;
    cout << to_string(t6) << endl;
    cout << to_string(t7) << endl;
    cout << to_string(t8) << endl;
    cout << "--------------" << endl;

    //时间转字符串    
    cout << posix_time::to_iso_extended_string(t1) << endl;
    cout << posix_time::to_iso_string(t1) << endl;
    cout << posix_time::to_simple_string(t1) << endl;
    cout << posix_time::to_time_t(t1) << endl;

    //时间点 + 时间长度
    posix_time::ptime ptNow = posix_time::second_clock::local_time();
    auto ptResult = ptNow + gregorian::days(100) + posix_time::hours(1) + posix_time::minutes(1) + posix_time::seconds(1) + posix_time::microseconds(456561);
    cout << "当前时间:" << to_string(ptNow) << ", 100天1小时1分1秒456561微秒后的时间是:" << to_string(ptResult) << endl;

    //时间段,比如今年剩下的时间
    posix_time::time_period tp1(ptNow, posix_time::ptime(gregorian::date(2025,01,01)));
    cout << tp1 << endl;
    //时间段的时长是多少?
    cout << "今年所剩时长(小时数):" << tp1.length().hours() << endl;
    //判断某一个时间点是否在时间段内
    cout << tp1.contains(posix_time::time_from_string("2024-08-01 00:00:00")) << endl;
    cout << tp1.contains(posix_time::time_from_string("2024-03-01 00:00:00")) << endl;

    //时间段的交集
    posix_time::time_period tp2(posix_time::time_from_string("2024-03-15 00:00:00"), posix_time::time_from_string("2024-05-05 00:00:00"));
    cout << "时间段:" << to_string(tp1) << "和时间段" << to_string(tp2) << "的交集是:" << to_string(tp2.intersection(tp1)) << endl;

    //时间段的并集
    cout << "时间段:" << to_string(tp1) << "和时间段" << to_string(tp2) << "的并集是:" << to_string(tp2.merge(tp1)) << endl;

    //时间遍历(迭代)
    posix_time::time_iterator it(ptNow, posix_time::seconds(25)); //25秒为步长
    posix_time::ptime ptEnd = ptNow + posix_time::minutes(2);     //2分钟为总遍历长度
    while(it < ptEnd){
        cout << to_string(*it) << endl;
        ++it;
    }

    return 0;
}

程序输出:

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值