boost:date_time库——处理时间

date_time 库在格里高利历的基础上提供微秒级别的时间系统,如果需要,它最高可以达到纳秒级别的精度。

一、时间长度

表示时间长度的类是 time_duration,它可以表示包括时、分、秒、毫秒的时间长度。

它还有几个子类,表示不同的时间长度单位:

#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;

int main()
{
    time_duration td(1,2,3,888);
    std::cout<<td<<std::endl;// 01:02:03.000888

    hours h(2);//时
    minutes(20);//分
    seconds(4);//秒
    millisec(999);//毫秒
    microsec(22);//微秒
}

时间长度可以是任意数字,超出范围的值会进位或借位:

    time_duration td(1,10086,3,888);
    std::cout<<td<<std::endl;// 169:06:03.000888

使用子类可以直观地赋值:

    time_duration td2 = hours(2) + minutes(30) + seconds(77);

也可以从字符串创建:

    time_duration td3 = duration_from_string("1:10:20:333");

成员函数:

#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;

int main()
{
    time_duration td(1,10086,3,888);
    std::cout<<td<<std::endl;// 169:06:03.000888
    std::cout<<td.hours()<<std::endl;//169
    std::cout<<td.minutes()<<std::endl;//6
    std::cout<<td.seconds()<<std::endl;//3
    std::cout<<td.total_seconds()<<std::endl;//时间长度的总秒数       608763
    std::cout<<td.total_milliseconds()<<std::endl;//总毫秒数         608763000
    std::cout<<td.fractional_seconds()<<std::endl;//以long返回微秒数  888
    std::cout<<td.total_microseconds()<<std::endl;//总微秒数          608763000888
    std::cout<<td.total_nanoseconds()<<std::endl;//总纳秒数           608763000888000
    std::cout<<td.is_negative()<<std::endl;//是否负值

    //is_xxx() 是否特殊时间 略

    std::cout<<to_simple_string(td)<<std::endl;//169:06:03.000888
    std::cout<<to_iso_string(td)<<std::endl;//1690603.000888

    //加减乘除运算、比较运算 略
}

二、时间精确度

要让精度变为纳秒级别,在导入文件之前定义宏:

#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;

int main()
{
    time_duration td(1,10086,3,888);
    std::cout<<td<<std::endl;
    std::cout<<td.total_microseconds()<<std::endl;
    std::cout<<td.total_nanoseconds()<<std::endl;
}

三、时间点

时间点的概念可以理解为一个日期加上一个小于24小时的时间长度。

ptime 是时间点的类,它是很轻量级的对象。

创建对象:

#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;
using namespace boost::gregorian;
int main()
{
    ptime p (date(2035,10,1),hours(20));
    std::cout<<p<<std::endl;
    std::cout<<time_from_string("2010-11-11 01:30:20")<<std::endl;
    std::cout<<from_iso_string("20101111T013020")<<std::endl;

    //从时钟产生当前时间
    ptime p1 = second_clock::local_time();//秒精度
    ptime p2 = microsec_clock::universal_time();//微秒精度
    std::cout<<p1<<" "<<p2<<std::endl;

    //特殊时间
    std::cout<<ptime(not_a_date_time)<<std::endl;//无效时间点
}

由于 ptime 相当于 date + time_duration,所以对它的操作可以分解为对这两个组成部分的操作。

#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;
using namespace boost::gregorian;
int main()
{
    ptime p (date(2035,10,1),hours(20) + minutes(30) + microsec(444));
    date d = p.date();
    time_duration td = p.time_of_day();

    //支持比较操作和加减操作
    ptime p2 = p + hours(3);

    //转换为字符串
    //1、转换为YYYY-mm-DD HH:MM:SS.ffffff(微秒)格式
    std::cout<<to_simple_string(p)<<std::endl;
    //2、转换为YYYYMMDDTHHMMSS,ffffff(微秒)格式
    std::cout<<to_iso_string(p)<<std::endl;
    //3、转换为YYYY-MM-DDTHH:MM:SS,ffffff(微秒)格式
    std::cout<<to_iso_extended_string(p)<<std::endl;

    std::cout<<p<<std::endl;
}

四、时间区间

与日期区间 date_period对应,类 time_period 表示时间区间的概念,它使用 ptime 作为区间的两个端点,左闭右开。time_period 的用法和 date_period 相似。

五、时间迭代器

时间迭代器类只有一个 time_iterator,它构造时传入一个起始时间点 ptime 对象和一个步长 time_duration 对象。

time_iterator 可以直接和 ptime 比较,无需使用解引用操作符。

#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;
using namespace boost::gregorian;
int main()
{
    ptime p(date(2022,10,1),hours(10));
    for(time_iterator it(p,minutes(10));it < p + hours(1);++it)
    {
        std::cout<<*it<<std::endl;
    }
}

六、应用:一个可以支持秒级别和微秒 / 纳秒级别的计时器

#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;
using namespace boost::gregorian;

template<typename Clock = microsec_clock> //默认为微秒级别
class basic_ptimer
{
public:
    basic_ptimer()
    {
        restart();
    }
    ~basic_ptimer()
    {
        elapsed();
    }
    void restart()
    {
        _start_time = Clock::local_time();
    }
    void elapsed() const
    {
        std::cout << Clock::local_time() - _start_time <<std::endl;
    }
private:
    ptime _start_time;
};
//typedef basic_ptimer<microsec_clock> ptimer;
//typedef basic_ptimer<second_clock>   sptimer;

using ptimer = basic_ptimer<microsec_clock>;
using sptimer = basic_ptimer<second_clock>;

int main()
{
    ptimer p;
    sptimer s;
    for(int i = 1,sum = 0;i < 100000000;++i)
    {
        sum += i;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值