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系统调用的使用方式
  1. 获取时间戳

    #include <time.h>
    #include <stdio.h>

    int main()
    {
    time_t t = time(NULL);
    printf("time stamp : %lld\n", t);
    }
  2. 获取时间

    #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);
    }
    1. 从上面的时间戳中转为tm结构

  3. time和tz之间的转换

    time_t t_ = mktime(&tm_);
  4. 获取毫/微秒级的时间
    系统函数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
  1. 如何获取当前的时间

    #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 直接读寄存器的值,最快
有效的建议
  1. 如果是c++11或以上,尽量使用chrono相关的应用

  2. 如果要求精度特别高,使用rdtsc

  3. 如果是纯c语言获取时间戳time。如果要获取到精度比较高的。使用gettimeofday


以上是关于c++中的时间处理的主要内容,如果未能解决你的问题,请参考以下文章

C++ 代码片段执行

有趣的 C++ 代码片段,有啥解释吗? [复制]

以下代码片段 C++ 的说明

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

如何理解这段代码片段中的两对括号?

什么是在 C++ 中获取总内核数量的跨平台代码片段? [复制]