2506C++,C++的时间库

2.1.std::chrono::system_clock的用法和示例

取当前时间

cpp 复制代码
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();

time_point取具体时间

cpp 复制代码
std::time_t tt = std::chrono::system_clock::to_time_t(now);
std::tm* ptm = std::localtime(&tt);
std::cout << "Current time is: " << std::put_time(ptm,"%c") << std::endl;

时间运算

cpp 复制代码
std::chrono::system_clock::time_point in_an_hour = std::chrono::system_clock::now() + std::chrono::hours(1);

2.2.std::chrono::steady_clock的用法和示例

当前时间

cpp 复制代码
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();

计算经过的时间

cpp 复制代码
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::chrono::steady_clock::duration elapsed = end - start;

转换时间单位

cpp 复制代码
long long elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(elapsed).count();

2.3.std::chrono::high_resolution_clock的用法和示例

当前时间

cpp 复制代码
std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();

计算经过的时间

cpp 复制代码
std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now();
std::chrono::high_resolution_clock::duration elapsed = end - start;

转换时间单位

cpp 复制代码
long long elapsed_microseconds = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();

3.取时间戳

cpp 复制代码
auto now = std::chrono::system_clock::now();

当前时间点的详细日期和时间

cpp 复制代码
auto now = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&t);

时间戳的应用

3.2.时间戳的转换和应用

按具体日期和时间转换时间戳

cpp 复制代码
auto now = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&t);
char buffer[80];
std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", now_tm);
std::cout << "Current time: " << buffer << std::endl;

转换时间单位

cpp 复制代码
std::chrono::seconds sec(1);
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(sec);

实际问题中应用时间戳

cpp 复制代码
auto start = std::chrono::high_resolution_clock::now();
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << "ns\n";

测量性能

cpp 复制代码
auto start = std::chrono::high_resolution_clock::now();
    //代码们
auto stop = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
std::cout << "Time taken by function: " << duration.count() << " microseconds" << std::endl;

记录日志

cpp 复制代码
auto now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::cout << "Log event happened at " << std::ctime(&now_c);

计算时间戳

cpp 复制代码
auto t1 = std::chrono::system_clock::now();
    //...一些代码...
auto t2 = std::chrono::system_clock::now();
auto duration = t2 - t1;
std::cout << "Duration between t1 and t2: " << duration.count() << " seconds\n";

4.实现计时器

4.1使用std::chrono库实现基本计时器

实现基本计时器

cpp 复制代码
#include <iostream>
#include <chrono>
int main() {
    auto start = std::chrono::high_resolution_clock::now();
    //开始计时你需要测量的代码块
    auto end = std::chrono::high_resolution_clock::now();
    //结束计时
    std::chrono::duration<double> diff = endstart;
    //计算`时间差`
    std::cout << "Code executed in " << diff.count() << " seconds" << std::endl;
    return 0;
}

4.2高级计时器功能与实现(如:挂起,重置)

挂起与恢复计时器

cpp 复制代码
#include <iostream>
#include <chrono>
class Timer {
    private:
        bool running;
        std::chrono::time_point<std::chrono::high_resolution_clock> start_time, end_time;
    public:
        Timer() : running(false) {}
        void start() {
            running = true;
            start_time = std::chrono::high_resolution_clock::now();
        }
        void stop() {
            if (running) {
                end_time = std::chrono::high_resolution_clock::now();
                running = false;
            }
        }
        double elapsed() {
            if (running) {
                return std::chrono::duration<double>(std::chrono::high_resolution_clock::now() - start_time).count();
            }
            else {
                return std::chrono::duration<double>(end_time - start_time).count();
            }
        }
        void reset() {
            running = false;
        }
};
int main() {
    Timer timer;
    timer.start();
    //一些代码
    timer.stop();
    std::cout << "Elapsed time: " << timer.elapsed() << " seconds." << std::endl;
    //继续计时器
    timer.start();
    //一些代码
    timer.stop();
    std::cout << "Total elapsed time: " << timer.elapsed() << " seconds." << std::endl;
    return 0;
}

5.按通用的时间参数使用std::chrono

5.1std::chrono::duration的应用

5.1.1创建时长对象

cpp 复制代码
std::chrono::duration<int> twenty_seconds(20);
std::chrono::duration<double, std::ratio<60>> half_a_minute(0.5);
std::chrono::duration<long, std::ratio<1,1000>> one_millisecond(1);

5.1.2操作时长对象

cpp 复制代码
std::chrono::seconds work_day(8*60*60);
    //8小时
std::chrono::seconds work_week = 5*work_day;

5.2.1转换时间单位

cpp 复制代码
std::chrono::milliseconds ms(1000);
std::chrono::seconds sec = std::chrono::duration_cast<std::chrono::seconds>(ms);

5.2.2std::chrono中的时间单位

std::chrono库中定义了许多常用的时间单位,比如:

cpp 复制代码
std::chrono::hours
std::chrono::minutes
std::chrono::seconds
std::chrono::milliseconds
std::chrono::microseconds
std::chrono::nanoseconds

此外,你也可用std::ratio创建自定义时间单位,比如:

cpp 复制代码
using half_seconds = std::chrono::duration<double, std::ratio<1, 2>>;

上面代码中,half_seconds代表半秒.

6.深入探讨std::chrono::system_clock::time_point

6.1.time_point的定义和主要特性

time_point使用示例

cpp 复制代码
#include <iostream>
#include <chrono>
int main() {
    //取当前的`时间点`
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    //按`时间戳`转换并打印
    std::time_t now_c = std::chrono::system_clock::to_time_t(now);
    std::cout << "当前时间:" << std::ctime(&now_c) << std::endl;
    return 0;
}

6.2.time_point的常见操作与示例

加减运算

cpp 复制代码
#include <iostream>
#include <chrono>
int main() {
    //取`当前时间点`
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    //创建一个1小时的`时长`对象
    std::chrono::hours one_hour(1);
    //通过加法运算得到1小时后的`时间点`
    std::chrono::system_clock::time_point one_hour_later = now + one_hour;
    return 0;
}

比较操作

cpp 复制代码
#include <iostream>
#include <chrono>
int main() {
    //取`当前时间点`
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    //创建一个1秒后的`时间点`
    std::chrono::system_clock::time_point one_sec_later = now + std::chrono::seconds(1);
    //比较两个`时间点`
    if (one_sec_later > now) {
        std::cout << "one_sec_later is later than now.\n";
    } else {
        std::cout << "one_sec_later is not later than now.\n";
    }
    return 0;
}

6.3.time_point,在实际问题中的应用示例

分发事件

cpp 复制代码
#include <iostream>
#include <chrono>
#include <thread>
void schedule_event(std::chrono::system_clock::time_point event_time) {
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    if (event_time > now) {
    //计算需要等待的时间
        std::chrono::duration<double> wait_time = event_time - now;
    //等待相应的时间
        std::this_thread::sleep_for(wait_time);
    }
    //执行事件
    std::cout << "Event executed at " << std::chrono::system_clock::to_time_t(now) << std::endl;
}
int main() {
    //分发在5秒后执行事件
    std::chrono::system_clock::time_point event_time = std::chrono::system_clock::now() + std::chrono::seconds(5);
    schedule_event(event_time);
    return 0;
}

网络通信的超时控制

cpp 复制代码
#include <iostream>
#include <chrono>
#include <thread>
bool try_connect(std::chrono::system_clock::time_point deadline) {
    while (std::chrono::system_clock::now() < deadline) {
    //试连接
        bool success = false;
    //这里只是示例,实际应用中需要调用具体的连接函数
        if (success) {
            return true;
        }
    //等待然后再试
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    //超时,连接失败
    return false;
}
int main() {
    //试在`10`秒内创建连接
    std::chrono::system_clock::time_point deadline = std::chrono::system_clock::now() + std::chrono::seconds(10);
    bool connected = try_connect(deadline);
    if (connected) {
        std::cout << "Connected.\n";
    } else {
        std::cout << "Failed to connect within 10 seconds.\n";
    }
    return 0;
}

7.深入探讨std::chrono::duration

7.2.1创建时长

cpp 复制代码
std::chrono::seconds sec(5);

7.2.2执行算术运算

cpp 复制代码
std::chrono::seconds sec1(5);
std::chrono::seconds sec2(3);
auto sec3 = sec1 + sec2;
    //`sec3`为8秒
auto sec4 = sec1 - sec2;
    //`sec4`为2秒

7.2.3比较时长

cpp 复制代码
std::chrono::seconds sec1(5);
std::chrono::seconds sec2(3);
if (sec1 > sec2) {
    //做点什么
}

7.2.4,按不同单位转换

cpp 复制代码
std::chrono::minutes min(1);
auto sec = std::chrono::duration_cast<std::chrono::seconds>(min);
    //秒是`60`秒

7.3时长在实际问题中的应用示例

7.3.1计算代码执行时间

cpp 复制代码
auto start = std::chrono::high_resolution_clock::now();
    //要测量的代码...
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = endstart;
std::cout << "Code executed in " << diff.count() << " seconds\n";

7.3.2实现延迟

cpp 复制代码
std::chrono::seconds delay(5);
    //延迟5秒
std::this_thread::sleep_for(delay);

8.1.微秒及其他时间单位的定义和特性

cpp 复制代码
std::chrono::microseconds microSec(1000);
    //创建一个表示`1000`微秒的`时长`对象
类似地,可创建其他`时间单位`的实例,如:
std::chrono::seconds sec(60);
    //创建一个表示`60`秒的`时长`对象
std::chrono::hours hr(1);
    //创建一个表示1小时的`时长`对象

一些使用std::chrono::microseconds和其他时长类型的常见操作的示例:

cpp 复制代码
std::chrono::microseconds usec1(1000);
std::chrono::microseconds usec2(2000);
    //加法
auto usec3 = usec1 + usec2;
    //`usec3`现在是`3000`微秒减法
auto usec4 = usec2 - usec1;
    //`usec4`现在是`1000`微秒乘法
auto usec5 = 2 * usec1;
    //`usec5`现在是`2000`微秒除法
auto half = usec1 / 2;
    //`half`现在是`500`微秒比较
if (usec1 < usec2) {
    //该条件是真,因为`1000`微秒小于`2000`微秒
}

8.3.微秒及其他时间单位实际问题中的应用示例

cpp 复制代码
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
    //处理音频或视频帧...
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::chrono::microseconds processing_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start);

第九章:std::chrono在模板编程和元模板中的应用

cpp 复制代码
template <typename T>
void print_duration(T d) {
    auto value = std::chrono::duration_cast<std::chrono::microseconds>(d).count();
    std::cout << "Duration: " << value << " microseconds\n";
}
template <typename T>
class Timer {
public:
    void start() {
        start_time = std::chrono::steady_clock::now();
    }
    T elapsed() {
        auto end_time = std::chrono::steady_clock::now();
        return std::chrono::duration_cast<T>(end_time - start_time);
    }
private:
    std::chrono::steady_clock::time_point start_time;
};

9.2std::chrono在元模板编程中的使用

cpp 复制代码
template <typename FromDuration, typename ToDuration>
struct duration_converter {
    static constexpr double ratio =
        double(ToDuration::period::num) / FromDuration::period::num *
        double(FromDuration::period::den) / ToDuration::period::den;
    static ToDuration convert(FromDuration d) {
        return ToDuration(static_cast<long long>(d.count() * ratio));
    }
};

9.3模板编程和元模板编程中std::chrono的高级应用示例

本例中,可定义一个可根据当前的std::chrono::duration应用不同特效EffectController类:

cpp 复制代码
template <typename T>
class EffectController {
public:
    void applyEffect(T duration) {
        if (duration < std::chrono::seconds(10)) {
            applyMorningEffect();
        } else if (duration < std::chrono::seconds(20)) {
            applyNoonEffect();
        } else {
            applyNightEffect();
        }
    }
private:
    void applyMorningEffect() {
    //应用晨间效果...
    }
    void applyNoonEffect() {
    //应用正午效果...
    }
    void applyNightEffect() {
    //应用夜间效果...
    }
};
template <typename T, typename Ratio>
class EffectController {
public:
    void applyEffect(T duration) {
        constexpr auto switch_point = std::chrono::duration<int, Ratio>(1);
        if (duration < switch_point) {
            applyMorningEffect();
        } else if (duration < 2 * switch_point) {
            applyNoonEffect();
        } else {
            applyNightEffect();
        }
    }
    // ...
};
相关推荐
机器视觉知识推荐、就业指导2 小时前
C++/Qt 联合编程中的定时器使用陷阱:QObject::startTimer 报错详解
c++·qt
慢半拍iii2 小时前
数据结构——D/串
c语言·开发语言·数据结构·c++
邪恶的贝利亚2 小时前
从基础到实战-rmpt to webrtc
c++·webrtc·rtmp·流媒体
whoarethenext3 小时前
使用 C/C++ 和 OpenCV 提取图像的感兴趣区域 (ROI)
c语言·c++·opencv
小玺玺3 小时前
[RDK X5] MJPG编解码开发实战:从官方API到OpenWanderary库的C++/Python实现
c++·python·opencv·rdk x5
德先生&赛先生4 小时前
深入理解c语言中的static
c++
景彡先生4 小时前
C++ 中的 iostream 库:cin/cout 基本用法
开发语言·c++
SundayBear7 小时前
适合有C基础后快速上手C++
开发语言·c++
顾三殇7 小时前
【自考】《计算机信息管理课程实验(课程代码:11393)》华师自考实践考核题型解析说明:C++ 与 mysql 实践题型与工具实践题分析
c++·mysql·华师自考实践考核题型分析
newki7 小时前
【NDK】项目演示-Android串口的封装工具库以及集成的几种思路
android·c++·app