C++中使用<chrono>库获取带毫秒的格式化时间戳

引言

在现代软件开发中,时间戳常常用于记录事件发生的具体时间。一个精确的时间戳可以帮助我们更好地追踪和分析程序的行为,尤其是在分布式系统或需要高精度计时的应用场景中。本文将介绍如何利用C++11引入的库来获取包含毫秒部分的格式化时间戳,并简要讨论其应用。

使用库获取时间戳

库是C++标准库的一部分,提供了处理时间点(time points)和时间段(durations)的功能。我们可以使用它来获取当前时间、计算持续时间等。下面我们将展示一个函数getFormattedTimestamp,该函数返回一个格式化的字符串表示的时间戳,精确到毫秒。

#include <iostream>
#include <iomanip>
#include <sstream>
#include <chrono>
#include <ctime>

std::string getFormattedTimestamp() {
    // 获取当前时间点
    auto now = std::chrono::system_clock::now();
    // 转换为time_t类型,用于获取秒级时间
    std::time_t now_time_t = std::chrono::system_clock::to_time_t(now);
    // 获取毫秒部分
    auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
        now.time_since_epoch()) % 1000;

    // 将时间转换为本地时间
    std::tm buf;
#ifdef _WIN32
    localtime_s(&buf, &now_time_t); // Windows平台使用localtime_s
#else
    localtime_r(&now_time_t, &buf); // 非Windows平台使用localtime_r
#endif

    // 格式化输出时间字符串
    std::ostringstream oss;

    oss << std::put_time(&buf, "%Y_%m_%d_%H_%M_%S") << '_'
        << std::setfill('0') << std::setw(3) << ms.count();
    //oss << std::put_time(std::localtime(&t), "%Y_%m_%d %H:%M:%S");
    return oss.str();
}

int main() {
    // 获取程序开始执行的时间点
    auto start1 = std::chrono::high_resolution_clock::now();

    std::string timestamp = getFormattedTimestamp();
    std::cout << "Current timestamp: " << timestamp << std::endl;

    // 获取程序执行完毕后的时间点
    auto end1 = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end1 - start1);
    std::cout << "程序运行时间: " << duration.count() << " 毫秒" << std::endl;
    return 0;
}

此代码段首先获取了当前时间点,并将其转换为time_t类型以获取秒级时间。然后通过duration_cast获取了从纪元开始到现在的毫秒数,并取模1000得到当前时间的毫秒部分。接着,它根据操作系统的不同选择合适的本地时间转换函数(localtime_s或localtime_r)。最后,它使用中的工具格式化时间字符串并返回。

测试与性能考量

为了测试上述函数的效率以及整个程序的执行时间,我们在main函数中添加了简单的性能测试代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氿 柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值