当前位置: 首页 > 科技观察

详细介绍C-C++时间相关函数

时间:2023-03-21 12:15:07 科技观察

本文转载自微信公众号《程序喵大师》,作者程序喵大师。转载本文请联系程序大师喵公众号。每个人通常都工作。如果你需要计算耗时函数或者打印当前时间,这篇文章一定要看!首先介绍一下C++标准中的chrono库。Chrono是一个关于时间的图书馆。它起源于boost,现在是C++。据说现在很多C++标准都是从boost衍生出来的。看来需要纳入标准的特性会先在boost中进行测试。先看使用chrono简单计时的示例代码:voidfunc(){//timingstd::chrono::time_pointbegin=high_resolution_clock::now();std::this_thread::sleep_for(std::chrono::milliseconds(20));autoend=high_resolution_clock::now();cout<<"time"<(end-begin).count()<>classduration;ratio定义如下:templateclassratio;rep表示数据类型,int,long等,Period表示时间单位,N是分子,D是分母,看例子就好了:usingatto=ratio<1,1000000000000000000LL>;usingfemto=ratio<1,1000000000000000LL>;usingpico=ratio<1,1000000000000LL>;usingnano=ratio<1,1000000000>;usingmicro=ratio<10illi=ratio>using;usingcenti=ratio<1,100>;usingdeci=ratio<1,10>;usingdeca=ratio<10,1>;usinghecto=ratio<100,1>;usingkilo=ratio<1000,1>;usingmega=ratio<1000000,1>;usinggiga=ratio<1000000000,1>;usingtera=ratio<1000000000000LL,1>;usingpeta=ratio<1000000000000000LL,1>;usingexa=ratio<100000000000usingglonn00=ose>0,second;usingmilliseconds=duration;usingseconds=duration;usingminutes=duration>;usinghours=duration>;usinghours2=duration>;usinghours2=duration>;详细看完上面的例子,你也会明白默认的比时间单位是1秒。以小时为例,一小时等于?0秒,?0/1==7200/2==3600,所以hours==hours2==hours3标准库也提供了Duration_cast转换各种持续时间。template,int>=0>constexpr_Toduration_cast(constduration<_Rep,_Period>&)noexcept(is_arithmetic_v<_Rep>&&is_arithmetic_v);=_Is_specialization_v<_Ty,duration>;template_INLINE_VARconstexprboolis_arithmetic_v=//determinewhether_Tyisanarithmetictypeis_integral_v<_Ty>||is_floating_point_v<_Ty>;函数看起来很繁琐,直接看示例代码:voidfunc(){autoseco::std::seconds(10);automill=std::chrono::duration_cast(sec);cout<classtime_point;用法如下:voidfunc(){std::chrono::time_pointtp(std::chrono::seconds(12));cout<tp(seconds(12));cout<tp2=time_point_cast(tp);cout<,nano>;usingduration=chrono::duration;usingtime_point=chrono::time_point;staticconstexprboolis_steady=false;_NODISCARDstatictime_pointnow()noexcept{//getcurrenttimereturntime_point(duration(_Xtime_get_ticks()));}_NODISCARDstatic__pt__time64_tto_time_t(const_time_tick/consttime_point)/consttime_point{rtto__time64_treturnstatic_cast<__time64_t>(_Time.time_since_epoch().count()/_XTIME_TICKS_PER_TIME_T);}_NODISCARDstatictime_pointfrom_time_t(__time64_t_Tm)noexcept{//convertfrom__time64_treturntime_point(duration(_Tm*_XTIME_TICKS_PER_TIME_T));}};steady_clock表示稳定的时钟,它只有一个函数,也就是now(),下一次调用now()的返回值必须大于上一次调用now()的返回值,并且不会受到系统时间修改的影响源码如下:structsteady_clock{//wrapsQueryPerformanceCounterusingrep=longlong;usingperiod=nano;usingduration=nanoseconds;usingtime_point=chrono::time_point;staticconstexprboolis_steady=true;_NODISCARDstatictime_pointnow()noexcept{//getcurrenttimeconstlonglong_Freq=_Query_perf_frequency();//doesn'tchangeaftersystembootconstlonglong_Ctr=_Query_perf_counter();static_assert(period::num==1,"Thisassumesperiod::num==1.");constlonglong_Whole=(_Ctr/_Freq)*period::den;constlonglong_Part=(_Ctr%_Freq)*period::den/_Freq;returntime_point(duration(_Whole+_Part));}};用法同前:voidfunc(){//timingstd::chrono::time_pointbegin=steady_clock::now();std::this_thread::sleep_for(std::chrono::milliseconds(20));autoend=steady_clock::now();cout<<"time"<(end-begin).count()<(now)<<"s\n";}如何获取当前时间戳?单位是毫秒voidfunc(){//获取当前时间戳,单位是毫秒structtimevaltime;gettimeofday(&time,NULL);cout<tm_year+1900,ptminfo->tm_mon+1,ptminfo->tm_mday,ptminfo->tm_hour,ptminfo->tm_min,ptminfo->tm_sec);ptminfo=gmtime(&rawtime);printf("curtimeis:%02d-%02d-%02d%02d:%02d:%02d\n",ptminfo->tm_year+1900,ptminfo->tm_mon+1,ptminfo->tm_mday,ptminfo->tm_hour,ptminfo->tm_min,ptminfo->tm_sec);}output:curtimeis:2020-09-2321:27:37curtimeis:2020-09-2313:27:37tm结构的时间可以用asctime:char显示*asctime(conststructm*time);和ctime类似,返回一个固定时间格式的字符串,只是传入的参数不同。voidfunc(){time_trawtime=time(NULL);structtm*info1=localtime(&rawtime);cout<<"正常日期和时间:"<