主要时间类型
std::ratio<num, den> 定义分式(std::ratio模板请参考《C++新标准之std::ratio》),例如:
std::ratio<60, 1> minutes;//<分子,分母>一分钟60秒
std::ratio<60 * 60> hource;//1小时3600秒
std::ratio<1, 1000> milliseconds; //1ms是1/1000秒
chrono命名空间定义好的时间单位
typedef duration <Rep, ratio<3600,1>> hours;
typedef duration <Rep, ratio<60,1>> minutes;
typedef duration <Rep, ratio<1,1>> seconds;
typedef duration <Rep, ratio<1,1000>> milliseconds;
typedef duration <Rep, ratio<1,1000000>> microseconds;
typedef duration <Rep, ratio<1,1000000000>> nanoseconds;
- 使用举例:
chrono::minutes mintu{2};//2分钟
chrono::seconds sec{3};//3秒钟
chrono::milliseconds mills{500};//500毫秒
auto dul = sec - mills;//两者差值,单位默认转到更小的 2500ms
dul.count(); //值为2500
std::this_thread::sleep_for(std::chrono::milliseconds(100)); //当前线程休眠100毫秒
- chrono::duration_cast<>() 时间单位转换
chrono::duration_cast<chrono::seconds>(mintu).count(); //2分钟换算为120秒
获取当前时间
time_point 表示一个时间点
- 获取当前时间
chrono::system_clock::time_point now = chrono::system_clock::now();//当前时间time_point格式
std::time_t oldTime = time(nullptr);//c函数获取当前时间
cout << "oldTime = " << oldTime << endl;
chrono::system_clock::time_point timePoint = chrono::system_clock::now();//stl库获取当前时间
std::time_t newTime = chrono::system_clock::to_time_t(timePoint);//转换为旧式接口,单位:秒
cout<<"newTime = " << newTime <<endl;// oldTime == timeT
- 格式化打印当前时间
/* chrono::system_clock::time_point与std::time_t类型可相互函数
* chrono::system_clock::to_time_t()
* chrono::system_clock::from_time_t()
*/
std::time_t nowTime = chrono::system_clock::to_time_t(now);//转换为 std::time_t 格式
std::put_time(std::localtime(&nowTime), "%Y-%m-%d %X"); // 2019-06-18 14:25:56
std::put_time用法请参考《std::put_time》
- std::localtime非线程安全,使用localtime_r函数代替
struct tm cutTm = {0};
std::put_time(localtime_r(&nowTime, &cutTm), "%Y-%m-%d %X");// 2019-06-18 14:25:56
打印程序执行耗时
/*
* 打印耗时,取变量构造函数与析构函数的时间差,单位ms
*/
class SpendTime
{
public:
SpendTime():_curTimePoint(std::chrono::steady_clock::now())
{
}
~SpendTime(){
auto curTime = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(curTime - _curTimePoint);
cout<<"SpendTime = "<< duration.count() <<"ms"<<endl;
}
private:
std::chrono::steady_clock::time_point _curTimePoint;
};
#include <ctime>
#include <limits>
/*
* 测量时间流逝
* 精度依赖于操作系统或编译器,具体依赖于std::clock()的返回值精度及CLOCKS_PER_SEC值的定义
*/
class Timer
{
public:
Timer() : _startTime(std::clock())
{
}
void Restart()
{
_startTime = std::clock();
}
/*
* 构造函数至今的耗时,单位s
*/
double Elapsed() const
{
return double(std::clock() - _startTime) / CLOCKS_PER_SEC;
}
/*
* 最小度量,以秒为单位
*/
double ElapsedMin() const
{
return double(1) / double(CLOCKS_PER_SEC);
}
/*
* 最大度量,以秒为单位
*/
double ElapsedMax() const
{
return (double(std::numeric_limits<std::clock_t>::max()) - double(_startTime) / double(CLOCKS_PER_SEC));
}
private:
std::clock_t _startTime;//毫秒级精度
};
判断时间戳是否为当天
#include <iomanip>
#include <thread>
#include <mutex>
#include <iomanip>
#include <chrono>
#include <time.h>
/*
* 判断是否是当天,时区问题内部已考虑
* @param timeStamp 当前时间戳(单位s)
* @return 0 今天
* >0 过去几天
* <0 将来几天
*/
int checkTimestamp(const std::time_t timeStamp)
{
static std::time_t sLastTimestamp = 0;
if (sLastTimestamp == 0) {
static std::once_flag oc;
std::call_once(oc, [&]()
{
tzset();//刷新时区
sLastTimestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
});
}
const int lastDay = (sLastTimestamp - timezone)/86400;//转换到当前时区,自1970年来的天数
const int curDay = (timeStamp - timezone)/86400;
sLastTimestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
return (curDay - lastDay);
}