boost - 时间与日期

boost-timer:

timer类可以测量时间的流逝,是一个小型计时器。

使用:

#include <boost/timer.hpp>
int main()
{
    boost::timer t; //声明时即计时
    cout << t.elapsed_max() << endl; //可度量最大时间 ,小时单位
    cout << t.elapsed_min() << endl; //可度量最小时间 ,秒单位
    for(int i = 0;i<1000000000;i++);
    cout << t.elapsed() << endl; //输出流逝的时间 (cpu占用的时间)
}

boost-progress_timer:

继承自timer析构时自动输出时间,省去手动调elapsed(),

使用:

#include <boost/progress.hpp>
int main()
{
	boost::progress_timer t;
    cout << t.elapsed_max() << endl;
    cout << t.elapsed_min() << endl;
}

boost-progress_display:

表示进度

使用:

    boost::progress_display pd(10000000);
    for(int i = 0;i<10000000;i++)
    {
        ++pd;
    }

时间长度类time_duration

说明

  • 类似日期长度类date_duration有days、weeks、months、years这些常用类,
  • time_duration也有几个子类:hours、minutes、seconds、millisec、microsec、nanosec,他们都支持流输入输出、比较操作、加减乘除运算。

使用

//对象的定义
    boost::posix_time::time_duration td(1, 10, 30, 1000); //1小时10分钟30秒1毫秒
    boost::posix_time::time_duration  td1(1, 60, 60, 1000); //2小时1分钟1毫秒,超出的时间会自动进位
    boost::posix_time::time_duration td2 = boost::posix_time::duration_from_string("1:10:30:001");  //1小时10分钟30秒1毫秒

    //成员函数
    assert(td.hours() == 1 && td.minutes() == 10 && td.seconds() == 30);
    assert(td.total_seconds() == 1 * 3600 + 10 * 60 + 30);
    
    //获取字符串表示
    cout << boost::posix_time::to_simple_string(td) << endl; //输出为 01:10:30.001000
    cout << boost::posix_time::to_iso_string(td) << endl; //输出为 011030.001000

    //运算
    boost::posix_time::hours h(1);
    boost::posix_time::minutes m(10);
    boost::posix_time::seconds s(30);
    boost::posix_time::millisec ms(1);
    boost::posix_time::time_duration td3 = h + m + s + ms;
    assert(td2 == td3);

时间点ptime

说明

  • 创建ptime的方法是在其构造函数传入一个date和一个time_duration,不传入time_duration的话为0点,ptime支持流输入输出、比较操作、减法运算、与date_duration、time_duration的加减运算:

使用

    //对象的定义
    boost::posix_time::ptime p(boost::gregorian::date(2010, 3, 5)); //2010年3月5号0点
    boost::posix_time::ptime p1(boost::gregorian::date(2010, 3, 5), boost::posix_time::hours(1)); //2010年3月5号1点
    boost::posix_time::ptime p2 = boost::posix_time::time_from_string("2010-3-5 01:00:00");
    boost::posix_time::ptime p3 = boost::posix_time::from_iso_string("20100505T010000");

    //获取当前时间
    boost::posix_time::ptime p4 = boost::posix_time::second_clock::local_time(); //本地时间,秒精度
    cout << p4 << endl; //可以直接输出ptime,2018-Apr-11 16:23:54
    //boost::posix_time::ptime p4 = boost::posix_time::microsec_clock::local_time(); //本地时间,微妙精度,2018-Apr-11 08:23:54.986535
    //boost::posix_time::ptime p4 = boost::posix_time::second_clock::universal_time(); //UTC时间,微妙精度

    //获取字符串表示
    cout << boost::posix_time::to_iso_extended_string(p) << endl; //输出为2010-03-05T00:00:00
    cout << boost::posix_time::to_iso_string(p) << endl; //输出为20100305T000000
    cout << boost::posix_time::to_simple_string(p) << endl; //输出为2010-Mar-05 00:00:00

ptime相当于date + time_duration,所以对于它的操作可以分解为对这两个部分的操作,可以通过两个成员函数date()和time_of_day()获得日期和时间段,然后分别处理,如:

boost::posix_time::ptime p4(boost::gregorian::date(2010, 3, 20), 					boost::posix_time::hours(12) + boost::posix_time::minutes(30));
    boost::gregorian::date d = p4.date(); //获取date
    boost::posix_time::time_duration td4 = p4.time_of_day(); //获取time_duration

    assert(d.month() == 3 && d.day() == 20);
    assert(td4.total_seconds() == 12 * 3600 + 30 * 60);

    boost::posix_time::ptime p5 = p4 + boost::posix_time::hours(3);
    assert(p4 < p5);
    assert(p5 - p4 == boost::posix_time::hours(3));
    p5 += boost::gregorian::months(1);
    
    boost::posix_time::ptime pTime = boost::posix_time::second_clock::local_time();
    std::string strDate = boost::gregorian::to_iso_extended_string(pTime.date()); // 当前日期:2019-03-06
    std::string strTimeOfDay = boost::posix_time::to_simple_string(pTime.time_of_day()); // 当前时间:15:03:55
    std::string strTime = strDate + ", " + strTimeOfDay; // 当前日期和时间:2019-03-06, 15:03:55

高精度的timer

说明

boost::timer的精度只有毫秒,利用date_time库可以实现一个微妙级别的计时器:

使用

#include "boost\date_time\posix_time\posix_time.hpp"

template<typename Clock = boost::posix_time::microsec_clock>
class basic_ptimer
{
public:
    basic_ptimer() { restart(); }
    virtual ~basic_ptimer(){}
public:
    void restart() { _start_time = Clock::local_time(); }
    double elapsed()
    {
        return (Clock::local_time() - _start_time).total_microseconds() / (double)(1000 * 1000); 
    } //以秒为单位,精度为微秒
    string elapsed_s() 
    {
        return boost::posix_time::to_simple_string(Clock::local_time() - _start_time);
    } //格式为hh:mm:ss.ffffff,精度为微秒
private:
    boost::posix_time::ptime _start_time;
};
typedef basic_ptimer<> ptimer;


int main()
{
    ptimer p2;
    Sleep(1000);
    printf("%.6f\n", p2.elapsed()); //输出为1.001057
    //cout << p2.elapsed_s() << endl; //输出为00:00:01.001057
}