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
}