IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Boost日期时间(date_time)—时间 -> 正文阅读

[开发工具]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节实现更高精度的计时器

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 08:19:54  更:2021-11-25 08:21:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:49:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码