std::chrono时间处理

这篇具有很好参考价值的文章主要介绍了std::chrono时间处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

std::chrono是C++11引入的标准库,用于时间的计算和处理。它按照ISO8601标准定义了多个时间类,例如:duration(持续时间)、time_point(时间点)和clock(时钟)。以下是一些常见的用法:

1. 计算程序运行时间


#include <iostream>
#include <string>
#include <chrono>
#include <unistd.h>
#include <sstream>
#include <iomanip>
#include <thread>

int main(int argc, char *argv[])
{  
    //1. 计算耗时
    auto start = std::chrono::system_clock::now();
    //std::chrono::time_point start = std::chrono::system_clock::now();
    int32_t j = 0;
    for(int i=0;i<10000;i++)
    {
        j++;
    }        

    //sleep(1);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    
    auto end = std::chrono::system_clock::now();
    auto diff1 = std::chrono::duration_cast<std::chrono::seconds>(end - start).count();         //秒
    auto diff2 = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();    //毫秒
    auto diff3 = std::chrono::duration_cast<std::chrono::microseconds> (end - start).count();   //微妙
    auto diff4 = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();     //纳秒
    //std::chrono::minutes
    //std::chrono::hours    
    
    std::cout<<"diff1 is: "<<diff1<<std::endl;
    std::cout<<"diff2 is: "<<diff2<<std::endl;
    std::cout<<"diff3 is: "<<diff3<<std::endl;
    std::cout<<"diff4 is: "<<diff4<<std::endl;


    return 0;
}

输出

diff1 is: 1
diff2 is: 1001
diff3 is: 1001608
diff4 is: 1001608504

2. 等待时间

线程的等待时间

std::this_thread::sleep_for(std::chrono::seconds(1));

3. 获取当前时间以及时间转换

获取当前时间

auto nowTime = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(nowTime);
std::cout << "nowTime is: " << std::ctime(&t) << std::endl;    

输出

nowTime is: Fri Jun  9 08:01:18 2023

时间转换
在工作中上述的时间不是我们需要的,通常用到的时间为string和int类型:

类型 说明
2023-06-09 08:01:18 string类型
1686297678 int64类型(秒级,10位)
1686297678549 int64类型(毫秒级,13位)
1686297678549829 int64类型(微妙级,16位)
1686297678549829794 int64类型(纳秒级,19位)

时间类型的转换

转换类型 转换类型
time_point -> string time_point -> int64
string -> time_point string -> int64
int64 -> string int64 -> time_point

测试demo

time_conversion.hpp文件的下载地址文章来源地址https://www.toymoban.com/news/detail-477870.html

/*
 * @brief: example about time format conversion by chrono
 * @data: 2023/06/09
 * @complie: g++ -g main.cc time_conversion.hpp -o d -std=c++11
 * @author: guokerenjian
 * @lastEditDate: 
 */

#include <iostream>
#include "time_conversion.hpp"

using namespace t_convert;

int main()
{
	TimeConvert tc;

	auto nowTime = std::chrono::system_clock::now();
    std::time_t t = std::chrono::system_clock::to_time_t(nowTime);
    std::cout << "nowTime is: " << std::ctime(&t) << std::endl;    

    //1.time_point -> string
    std::cout<<"time_point -> string"<<std::endl;
    std::string strTime;
    if(tc.timePointToString(nowTime, strTime))
	{
		std::cout<<"strTime is: "<<strTime<<"\n\n";
	}
	else
	{
		std::cout<<"failure"<<std::endl;
	}    

    //2.time_point -> int64
    std::cout<<"time_point -> int64"<<std::endl;
    int64_t itime{0};
    if(tc.timePointToInt64(nowTime, itime, TIME_TYPE::SECOND_TIME))  //秒
	{
		std::cout<<"itime is: "<<itime<<"\n";    
	}
	if(tc.timePointToInt64(nowTime, itime, TIME_TYPE::MILLISSECOND_TIME))  //毫秒
	{
		std::cout<<"itime is: "<<itime<<"\n";    
	}
	if(tc.timePointToInt64(nowTime, itime, TIME_TYPE::MICROSECOND_TIME))  //微妙
	{
		std::cout<<"itime is: "<<itime<<"\n";    
	}
	if(tc.timePointToInt64(nowTime, itime, TIME_TYPE::NANOSECOND_TIME))  //纳秒
	{
		std::cout<<"itime is: "<<itime<<"\n\n";    
	}    

    //3.string -> time_point
    std::cout<<"string -> time_point"<<std::endl;
    decltype(nowTime) resultTime;
    if(tc.stringToTimePoint(strTime, resultTime))
	{
		std::time_t t_result = std::chrono::system_clock::to_time_t(resultTime);
    	std::cout << "resultTime is: " << std::ctime(&t_result) <<"\n\n";
	}    

    //4.string -> int64
    std::cout<<"string -> int64"<<std::endl;
    int64_t time_int{0};
    if(tc.stringToInt64(strTime, time_int))
	{
		std::cout<<"time_int is: "<<time_int<<"\n\n";
	}
    

    //5.int64 -> time_point
    std::cout<<"int64 -> time_point"<<std::endl;
    decltype(nowTime) resultTimeFromeInt;    
    int64_t time_test{0};
	if(tc.timePointToInt64(nowTime, time_test, TIME_TYPE::UNKOWN) && tc.Int64ToTimePoint(time_test,resultTimeFromeInt))
	{
		std::time_t t_result_int = std::chrono::system_clock::to_time_t(resultTimeFromeInt);
    	std::cout << "t_result_int is: " << std::ctime(&t_result_int) <<"\n";
	}

	if(tc.timePointToInt64(nowTime, time_test, TIME_TYPE::MILLISSECOND_TIME) && tc.Int64ToTimePoint(time_test,resultTimeFromeInt))
	{
		std::time_t t_result_int = std::chrono::system_clock::to_time_t(resultTimeFromeInt);
    	std::cout << "t_result_int is: " << std::ctime(&t_result_int) <<"\n";
	}

	if(tc.timePointToInt64(nowTime, time_test, TIME_TYPE::MICROSECOND_TIME) && tc.Int64ToTimePoint(time_test,resultTimeFromeInt))
	{
		std::time_t t_result_int = std::chrono::system_clock::to_time_t(resultTimeFromeInt);
    	std::cout << "t_result_int is: " << std::ctime(&t_result_int) <<"\n";
	}

	if(tc.timePointToInt64(nowTime, time_test, TIME_TYPE::NANOSECOND_TIME) && tc.Int64ToTimePoint(time_test,resultTimeFromeInt))
	{
		std::time_t t_result_int = std::chrono::system_clock::to_time_t(resultTimeFromeInt);
    	std::cout << "t_result_int is: " << std::ctime(&t_result_int) <<"\n\n";
	}

    //6.time_point -> string
    std::cout<<"time_point -> string"<<std::endl;
    std::string str_time_result;
	if(tc.Int64ToString(time_test, str_time_result))
	{
		std::cout<<"str_time_result is: "<<str_time_result<<std::endl;
	}    

	return 0;
}

到了这里,关于std::chrono时间处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++ 11标准模板(STL) std::vector (二)

    template     class T,     class Allocator = std::allocatorT class vector; (1) namespace pmr {     template class T     using vector = std::vectorT, std::pmr::polymorphic_allocatorT; } (2) (C++17 起) 1) std::vector 是封装动态数组的顺序容器。 2) std::pmr::vector 是使用多态分配器的模板别名。 元素相继存储,这意味着不

    2024年02月02日
    浏览(52)
  • c++11 标准模板(STL)(std::basic_stringstream)(四)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_stringstream; (C++11 前) template     class CharT,     class Traits = std::char_traitsCharT,     class Allocator = std::allocatorCharT class basic_stringstream; (C++11 起) 类模板 std::basic_stringstream 实现基于字符串的流上的输入与输出操作。它等效

    2024年02月10日
    浏览(34)
  • c++11 标准模板(STL)(std::basic_ifstream)(一)

    定义于头文件  fstream template     class CharT,     class Traits = std::char_traitsCharT class basic_ifstream : public std::basic_istreamCharT, Traits 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istream 的高层接口赋予基于文件的流缓冲( std::basic_filebuf )。 std::basic_ifstream 的典型实

    2024年02月14日
    浏览(33)
  • c++11 标准模板(STL)(std::basic_ostream)(八)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_ostream : virtual public std::basic_iosCharT, Traits 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式输出(例如整数值)和无格式输出(例如生字符和字符数组)。此功能以 basic_streambuf 类所提供的接

    2024年02月12日
    浏览(38)
  • c++11 标准模板(STL)(std::basic_stringstream)(一)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_stringstream; (C++11 前) template     class CharT,     class Traits = std::char_traitsCharT,     class Allocator = std::allocatorCharT class basic_stringstream; (C++11 起) 类模板 std::basic_stringstream 实现基于字符串的流上的输入与输出操作。它等效

    2024年02月10日
    浏览(37)
  • c++11 标准模板(STL)(std::basic_istream)(一)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_istream : virtual public std::basic_iosCharT, Traits 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)。

    2024年02月13日
    浏览(30)
  • c++11 标准模板(STL)(std::basic_istream)(三)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_istream : virtual public std::basic_iosCharT, Traits  类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)

    2024年02月13日
    浏览(37)
  • c++11 标准模板(STL)(std::priority_queue)(四)

    template     class T,     class Container = std::vectorT,     class Compare = std::lesstypename Container::value_type class priority_queue; priority_queue 是容器适配器,它提供常数时间的(默认)最大元素查找,对数代价的插入与释出。 可用用户提供的 Compare 更改顺序,例如,用 std::greaterT 将导致最小元

    2024年02月01日
    浏览(43)
  • c++11 标准模板(STL)(std::unordered_multimap)(九)

    template     class Key,     class T,     class Hash = std::hashKey,     class KeyEqual = std::equal_toKey,     class Allocator = std::allocator std::pairconst Key, T class unordered_multimap; (1) (C++11 起) namespace pmr {     template class Key, class T,               class Hash = std::hashKey,               class Pred = std::equa

    2023年04月09日
    浏览(37)
  • RTDETR 引入 UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

    大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究

    2024年01月23日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包