c++中的时间处理
Posted cpp有效编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中的时间处理相关的知识,希望对你有一定的参考价值。
参考资料
cpp官方文档:https://en.cppreference.com/w/cpp/chrono
时间处理往往有以下几种
1、获取时间戳
2、获取当天的时间,年月日时分秒
3、时间的运算,譬如:向前推移1小时2分钟3秒
4、时间差,譬如:用户计算程序的运行时间
c++11之前/纯c系统调用的使用方式
获取时间戳
#include <time.h>
#include <stdio.h>
int main()
{
time_t t = time(NULL);
printf("time stamp : %lld\n", t);
}获取时间
#include <time.h>
#include <stdio.h>
int main()
{
time_t t = time(NULL);
printf("time stamp : %lld\n", t);
tm* tm_ = localtime(&t);
int year = tm_->tm_year + 1900; // 年,tm结构体存储的是从1900年开始的时间,所以tm_year加上1900
int month = tm_->tm_mon + 1; // 月,tm结构体的月份存储范围为0-11,所以为tm_mon加上1
int day = tm_->tm_mday; // 日
int hour = tm_->tm_hour; // 时
int minute = tm_->tm_min; // 分
int second = tm_->tm_sec;
printf("year: %d, month: %d, day: %d, hour: %d, minute: %d, second: %d\n",
year, month, day, hour, minute, second);
}从上面的时间戳中转为tm结构
time和tz之间的转换
time_t t_ = mktime(&tm_);
获取毫/微秒级的时间
系统函数time只能获取秒级的精度。如果想获取毫/微秒级的精度,那么需要其他的技巧。linux下面可以直接使用gettimeofday。#include <sys/time.h>
#include <stdio.h>
int main()
{
struct timeval curTime;
gettimeofday(&curTime, NULL);
printf("sec: %d, usec: %d\n", curTime.tv_sec, curTime.tv_usec);
}在windows下面并么有gettimeofday的系统函数,可以通过封装一个实现了跨平台。
#include <time.h>
#if (defined(WIN32) || defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER))
#include <windows.h>
#else
#include <sys/time.h>
#endif
#if (defined(WIN32) || defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER))
int gettimeofday(struct timeval *tp, void *tzp)
{
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm. tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec = (long)clock;
tp->tv_usec = wtm.wMilliseconds * 1000;
return (0);
}
#endif
c++11 中的时间处理
c++11中时间的处理,放在一个
主要涉及的类和函数
涉及的类
system_clock(主要关注), steady_clock, high_resolution_clock
time_point
duration
seconds等时间的表示类涉及的函数
system_clock::now() //获取当时的时间,返回类型为time_point
duration_cast() //主要是获取的时间进行转换,譬如:转换为秒。涉及到ratio,ratio实际上是一个分子和分母,duration_cast通过这种类型在编译期间进行运算。
//std::chrono::minutes duration</*signed integer type of at least 29 bits*/, std::ratio<60>> =>第二个参数默认是1,所以这个是60/1=60
如何获取当前的时间
#include <chrono>
#include <iostream>
using namespace std;
int main()
{
// 获取当天的时间
auto curTimePoint = chrono::system_clock::now();
// 获取当前的时间戳
cout << curTimePoint.time_since_epoch().count() << endl;
auto d1 = chrono::seconds(10);
// 把当前时间向后推10秒钟
auto time2 = curTimePoint + d1;
cout << time2.time_since_epoch().count() << endl;
// 转为经过的小时
cout << chrono::duration_cast<chrono::hours>(time2.time_since_epoch()).count() << endl;
//转为time_t的结构
time_t t = chrono::system_clock::to_time_t(time2);
cout << t << endl;
}
其他获取时间的方式
资料参考2020年cpp峰会资料
函数 | 精度(微秒) | 耗时(时钟周期) | 备注 |
---|---|---|---|
clock | 1 | ~1800 | 发生系统调用 |
gettimeofday | 1 | ~69 | 不发生系统调用 |
clock_gettime | 0.0265(38) | ~67 | 不发生系统调用 |
std::chrono::system_clock | 0.0274(38) | ~68 | c++11标准,建议使用 |
std::chrono::steady_clock | 0.0272(28) | ~68 | c++11标准,建议使用 |
std::chrono::high_resolution_clock | 0.0275(20) | ~69 | c++11标准,建议使用 |
rdtsc | 0.00965(48) | ~24 | 直接读寄存器的值,最快 |
有效的建议
如果是c++11或以上,尽量使用chrono相关的应用
如果要求精度特别高,使用rdtsc
如果是纯c语言获取时间戳time。如果要获取到精度比较高的。使用gettimeofday
以上是关于c++中的时间处理的主要内容,如果未能解决你的问题,请参考以下文章