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;
}
}