Boost日期时间(date_time)—时间

目录

一、基本介绍

二、时间长度

三、时间精确度

四、时间点(ptime)-基本介绍

五、时间点(ptime)-对象创建

六、时间点(ptime)-基本运用

七、时间区间

八、时间迭代器-个人认为这个用处还比较多

九、扩展-高精度计时器


一、基本介绍

  1. 引入头文件:#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节实现更高精度的计时器

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值