目录
一、基本介绍
二、时间长度
三、时间精确度
四、时间点(ptime)-基本介绍
五、时间点(ptime)-对象创建
六、时间点(ptime)-基本运用
七、时间区间
八、时间迭代器-个人认为这个用处还比较多
九、扩展-高精度计时器
一、基本介绍
- 引入头文件:#include <boost/date_time/posix_time/posix_time.hpp>
二、时间长度
int main(int argc, char **argv) {
// 创建时间长度,构造函数中直接传入时分秒和微秒值
boost::posix_time::time_duration td(1, 10, 30, 1000); // 01:10:30
// 这里传入的时分秒微秒的值并不一定要在各自的限度内,超出限度的时间会自动进位
boost::posix_time::time_duration td1(1, 10, 30, 1000 * 1000 * 31); // 01:11:01
// 注意:并不能传入负值
boost::posix_time::time_duration td2(1, 10, -30, -1000 * 1000 * 31);// -1:-11:-1
// 可以通过传入字符串获取时间长度,字符串中时分秒微秒必须是冒号分割的
td = boost::posix_time::duration_from_string("1:10:30:001"); // 01:10:30
// 还可以更直观地给时间长度赋值
td = boost::posix_time::hours(1) + boost::posix_time::minutes(10) + boost::posix_time::seconds(59); // 01:10:59
// 不一定要在各自的限度内,就像这里可以传入负值,进行自动借位
td = boost::posix_time::hours(1) + boost::posix_time::minutes(-25) + boost::posix_time::seconds(-59); // 00:34:01
td *= 2; // 01:08:02
td += boost::posix_time::minutes(24); // 01:32:02
// time_durition 之间还可以直接进行大小比较
// 还可以超过范围,进行自动进位
td = boost::posix_time::hours(1) + boost::posix_time::minutes(75) + boost::posix_time::seconds(59); // 02:15:59
td += boost::posix_time::milliseconds(200);
// 怎么去访问time_duration中的时分秒?
printf("%02d:%02d:%02d\n", (int)td.hours(), (int)td.minutes(), (int)td.seconds()); // 02:15:59
// 获取总秒数呢?
printf("total seconds: %d\n", (int)td.total_seconds()); // total seconds: 8159
// 获取总毫秒数
printf("total milliseconds: %d\n", (int)td.total_milliseconds()); // total milliseconds: 8159200
// 获取总微秒数 #include <inttypes.h> PRId64
printf("total microseconds: %" PRId64 "\n", td.total_microseconds()); // total microseconds: 8159200000
return 0;
}
三、时间精确度
一般来说只会用到微秒,所以这里就简单了解下
#include <iostream>
#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG // 必须在头文件之前定义宏,否则无效!!!
#include <boost/date_time/posix_time/posix_time.hpp>
int main(int argc, char **argv) {
// 第四个参数,如果精确度是微秒,单位就是微秒,如果精确度是纳秒,单位就是纳秒
boost::posix_time::time_duration td(1, 10, 30, 1000); // 01:10:30
// 查看当前的精确度
if (td.resolution() == boost::date_time::nano) printf("精确度:纳秒\n");
else printf("精确度:微秒\n");
// 返回秒的小数部分的位数(微秒6位,纳秒9位)
std::cout << td.num_fractional_digits() << std::endl;
// 对于以下输出,默认微秒精度输出:01:10:30.001000 纳秒精度输出:01:10:30.000001000
std::cout << td << std::endl;
// 对于以下输出,在纳秒精度下,微秒会被忽略(微秒:4230001 纳秒:4230000)
std::cout << td.total_milliseconds() << std::endl;
// 下面的这个方法,就是输出小数点后面的数值,单位随精确度变化
std::cout << td.fractional_seconds() << std::endl;
return 0;
}
四、时间点(ptime)-基本介绍
- 定义:时间点(ptime)=日期(date)+小于24小时的时间长度(time_duration)
- 依赖于date,所以需要引入头文件:#include <boost/date_time/gregorian/gregorian.hpp>
- 可以拆分成 日期(pt.date()) 和 时间长度(pt.time_of_day()) 分别进行处理
五、时间点(ptime)-对象创建
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main(int argc, char **argv) {
// 通过构造函数创建对象
boost::gregorian::date dt(2021, 11, 24);
boost::posix_time::time_duration td(14, 9, 14);
boost::posix_time::ptime pt(dt, td);
boost::posix_time::ptime pt1(dt); // 不传时间长度,默认为零点
std::cout << pt << std::endl; // 2021-Nov-24 14:09:14
// 从字符串创建对象
pt = boost::posix_time::time_from_string("2021-11-24 14:11:34");
std::cout << pt << std::endl; // 2021-Nov-24 14:11:34
pt = boost::posix_time::from_iso_string("20211124T141134");
std::cout << pt << std::endl; // 2021-Nov-24 14:11:34
// 这样会导致运行异常 pt = boost::posix_time::from_iso_string("20211124T141134--");
// 获取当前时间
pt = boost::posix_time::second_clock::local_time(); // 本地时间 秒精度
std::cout << pt << std::endl; // 2021-Nov-24 14:16:39
pt = boost::posix_time::second_clock::universal_time(); // UTC 微秒精度
std::cout << pt << std::endl; // 2021-Nov-24 06:16:39
return 0;
}
六、时间点(ptime)-基本运用
#include <iostream>
#include <time.h>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main(int argc, char **argv) {
// 获取当前时间
boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); // 本地时间 秒精度
std::cout << boost::posix_time::to_simple_string(pt) << std::endl; // 2021-Nov-24 14:35:04
std::cout << boost::posix_time::to_iso_string(pt) << std::endl; // 20211124T143504
std::cout << boost::posix_time::to_iso_extended_string(pt) << std::endl; // 2021-11-24T14:35:04
// 转换C结构,进行处理
tm t = boost::posix_time::to_tm(pt);
// 2021-11-24 14:37:12
printf("%4d-%02d-%02d %02d:%02d:%02d\n", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
// tm 转 ptime
time_t timer = time(NULL);
tm *t_tm = localtime(&timer);
pt = boost::posix_time::ptime_from_tm(*t_tm);
// time_t 与 ptime 的转换
timer = boost::posix_time::to_time_t(pt);
pt = boost::posix_time::from_time_t(timer);
return 0;
}
七、时间区间
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
// 区间是左闭右开的
int main(int argc, char **argv) {
boost::posix_time::ptime pt(boost::gregorian::date(2021, 11, 01));
// 区间:从pt开始,向后延伸12小时
boost::posix_time::time_period tp1(pt, boost::posix_time::hours(12));
std::cout << tp1.begin() << " - " << tp1.end() << std::endl;
// 输出:2021-Nov-01 00:00:00 - 2021-Nov-01 12:00:00
// 区间向后平移1小时
tp1.shift(boost::posix_time::hours(1));
std::cout << tp1.begin() << " - " << tp1.end() << std::endl;
// 输出:2021-Nov-01 01:00:00 - 2021-Nov-01 13:00:00
// 区间向两端扩展10小时:是两边各10小时
tp1.expand(boost::posix_time::hours(10));
std::cout << tp1.begin() << " - " << tp1.end() << std::endl;
// 输出:2021-Oct-31 15:00:00 - 2021-Nov-01 23:00:00
return 0;
}
八、时间迭代器-个人认为这个用处还比较多
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main(int argc, char **argv) {
boost::posix_time::ptime pt(boost::gregorian::date(2021, 11, 01));
boost::posix_time::time_iterator t_iter(pt, boost::posix_time::hours(1));
while (t_iter < pt + boost::posix_time::hours(24)) {
std::cout << *t_iter << std::endl;
++t_iter;
}
return 0;
}
九、扩展-高精度计时器
可以参考《Boost程序库完全开发指南》2.7.10节实现更高精度的计时器
|