c++11 chrono

chrono是c++ 11中的时间库,提供计时,时钟等功能。
学习chrono,关键是理解里面时间段(Durations)、时间点(Time points)的概念。
1.精度:
时钟节拍(时间精度):
template class ratio;
其中N表示分子,D表示分母,默认用秒表示的时间单位。
N对应于其成员num,D对应于其成员den
常用的单位:
ratio<60, 1>                    minute
ratio<1, 1>                      second
ratio<1, 1000>               microsecond
#include  
#include  
using namespace std;  
int main()  
{  
    cout << "millisecond : ";  
    cout << std::chrono::milliseconds::period::num << "/" << std::chrono::milliseconds::period::den << "s" <    system("pause");  
    return 0;  
}  
输出:millisecond : 1/1000s


2.时间段:
template > class duration;
std::chrono::duration 表示一段时间,比如两个小时,12.88秒,半个时辰,一炷香的时间等等
Rep表示一种数值类型,用来表示Period的数量,比如int float double。
Period是ratio类型,用来表示上面所说的单位精度,比如second milisecond。
chrono中宏定义了许多特例化了的duration:
就是常见的hours,miniutes,seconds,milliseconds等,使用std::chrono::milliseconds直接使用。
(1)构造函数很简单
duration() = default;    //默认构造   
duration (const duration& dtn);        //(2)(3)拷贝构造   
template  constexpr duration (const duration& dtn);  
template      //传递一个某类型(int等)的数值,构造一个时间段      
   constexpr explicit duration (const Rep2& n);   
(2)成员函数count()返回单位时间的数量。
#include    
#include    
int main()  
{  
    std::chrono::milliseconds mscond(1000); // 1 second   
    std::cout << mscond.count() << " milliseconds.";  
    std::cout << mscond.count() * std::chrono::milliseconds::period::num / std::chrono::milliseconds::period::den;  
    std::cout << " seconds.\n";  
    system("pause");  
    return 0;  
}  
输出:1000 milliseconds. 1 seconds.
(3)当不要求截断值的情况下(时转换成秒是没问题,但是秒转换成时就不行)时间段的转换是隐式
的。显示转换可以由 std::chrono::duration_cast<> 来完成。
比如 std::chrono::milliseconds ms(54802);
std::chrono::seconds s=std::chrono::duration_cast(ms);
这里的结果就是截断的,而不是进行了舍入,所以s最后的值将为54。

3.时间点:
template
  class time_point;
std::chrono::time_point 表示一个具体时间,如上个世纪80年代、今天下午3点、火车出发时间等,只要它能用计算机时钟表示。
第一个模板参数Clock用来指定所要使用的时钟(标准库中有三种时钟,system_clock,steady_clock和high_resolution_clock。见4时钟详解),第二个模板函数参数用来表示时间的计量单位(特化的std::chrono::duration<> )
时间点都有一个时间戳,即时间原点。chrono库中采用的是Unix的时间戳1970年1月1日 00:00。所以time_point也就是距离时间戳(epoch)的时间长度(duration)。
(1)构造函数:time_point();           //默认构造函数,时间戳作为其值
(2) template
time_point (const time_point& tp);  //拷贝构造函数
(3) explicit time_point (const duration& dtn);           //使用duration构造,就是距离时间戳的时间长度
4)时间点有个重要的函数:duration time_since_epoch()  (用于获取当前时间点距离时间戳的时间长度)即经常用来得到当前时间点到1970年1月1日00:00的时间距离、该函数返回的duration的精度和构造time_point的时钟(Clock)有关(见4时钟详解)。
4.时钟:(代表当前系统的时间)
chrono中有三种时钟:system_clock,steady_clock和high_resolution_clock。每一个clock类中都有确定的time_point, duration, Rep, Period类型。
system_clock是不稳定的。因为时钟是可调的,即这种是完全自动适应本地账户的调节。这种调节可能造成的是,首次调用now()返回的时间要早于上次调用now()所返回的时间,这就违反了节拍频率的均匀分布。稳定闹钟对于超时的计算很重要,所以C++标准库提供一个稳定时钟 std::chrono::steady_clock。std::chrono::high_resolution_clock 是标准库中提供的具有最小节拍周期(因此具有最高的精度的时钟)。
上文所说time_since_epoch(),以及将要介绍的now()函数的返回值都依赖于时钟的精度,测试时钟的精度的一种方法就是:
#include   
#include   
using namespace std;
int main()
{
cout << "system clock          : ";
cout << chrono::system_clock::period::num << "/" << chrono::system_clock::period::den << "s" << endl;
cout << "steady clock          : ";
cout << chrono::steady_clock::period::num << "/" << chrono::steady_clock::period::den << "s" << endl;
cout << "high resolution clock : ";
cout << chrono::high_resolution_clock::period::num << "/" << chrono::high_resolution_clock::period::den << "s" << endl;
system("pause");
return 0;
}
输出:system clock          : 1/10000000s
steady clock          : 1/1000000000s
high resolution clock : 1/1000000000s


输出当前时间,并且计算当前的时间距离1970年1月1日00:00的毫秒数
#include    
#include    
#include    
using namespace std;  
int main()  
{  
    //定义毫秒级别的时钟类型   
    typedef chrono::time_point microClock_type;  
    //获取当前时间点,windows system_clock是100纳秒级别的(不同系统不一样,自己按照介绍的方法测试),所以要转换   
    microClock_type tp = chrono::time_point_cast(chrono::system_clock::now());  
    //转换为ctime.用于打印显示时间   
    time_t tt = chrono::system_clock::to_time_t(tp);  
    char _time[50];  
    ctime_s(_time,sizeof(_time),&tt);  
    cout << "now time is : " << _time;  
    //计算距离1970-1-1,00:00的时间长度,因为当前时间点定义的精度为毫秒,所以输出的是毫秒   
    cout << "to 1970-1-1,00:00  " << tp.time_since_epoch().count() << "ms" << endl;  
    system("pause");  
    return 0;  



//获取当前毫秒时间戳
#include
static int64_t ot() {
using namespace std::chrono;
auto const elapsed = system_clock::now().time_since_epoch();
return duration_cast(elapsed).count();
}
利用auto和std::chrono获取系统时间
const std::string getCurrentSystemTime()
{
auto tt = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
struct tm* ptm = localtime(&tt);
char date[60] = {0};
sprintf(date, "%d-%02d-%02d %02d:%02d:%02d",
(int)ptm->tm_year + 1900,(int)ptm->tm_mon + 1,(int)ptm->tm_mday,
(int)ptm->tm_hour,(int)ptm->tm_min,(int)ptm->tm_sec);
return std::string(date);
}
//距离时间戳时间
#include   
#include   
#include   
using namespace std;  
int main()  
{  
    //距离时间戳2两秒  
    chrono::time_point tp(chrono::seconds(2));  
    cout << "to epoch : " <    //转化为ctime,打印输出时间点  
    time_t tt = chrono::system_clock::to_time_t(tp);  
    char a[50];  
    ctime_s(a, sizeof(a), &tt);   //1970:01:01 00:00::02 
    cout << a;  
    system("pause");  
    return 0;  

}  

//获取随机值

int64_t time_now() {
return (int64_t)std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
}

你可能感兴趣的:(c/c++)