拥抱c++ chrono 抛弃 c time

本文介绍了在C++中获取UNIX时间戳的方法,包括使用std::chrono库进行时间点转换,并展示了如何进行时间戳的格式化输出和输入。此外,还讲解了如何计算时间差来衡量程序性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 获取当前UNIX时间戳(timestamp)

UNIX时间戳(timestamp):是以GMT/UTC时间「1970-01-01T00:00:00」为起点,到当前具体时间的秒数(不考虑闰秒)

    auto now_point = std::chrono::system_clock::now();

    auto new_point_s = std::chrono::time_point_cast<std::chrono::seconds>(now_point);
    std::cout << "UTC seconds     : " << new_point_s.time_since_epoch().count() << std::endl;

    auto new_point_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now_point);
    std::cout << "UTC microseconds: " << new_point_ms.time_since_epoch().count() << std::endl;

    auto new_point_us = std::chrono::time_point_cast<std::chrono::microseconds>(now_point);
    std::cout << "UTC microseconds: " << new_point_us.time_since_epoch().count() << std::endl;

    auto new_point_ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(now_point);
    std::cout << "UTC microseconds: " << new_point_ns.time_since_epoch().count() << std::endl;

说明:

C++标准定义了3个时钟(clock)类,分别是system_clock、steady_clock、high_resolution_clock。
system_clock:来自系统实时时钟的真实时间
steady_clock:能保证其时点(time_point)绝对不会递减的时钟。而system_clock无法保证,因为系统时间可以随时调整
high_resolution_clock:这个时钟的嘀嗒周期达到了最小值,high_resolution_clock可能是system_clock或者steady_clock的别名,具体取决于编译器。

2、格式化输出

(1)C++风格 std::put_time (头文件<iomanip>

auto now_point = std::chrono::system_clock::now();
std::time_t ttm = std::chrono::system_clock::to_time_t(now_point);
std::stringstream ss;
ss << std::put_time(localtime(&ttm), "%Y-%m-%d %H:%M:%S");
std::cout << ss.str() << std::endl;

(2)C风格strftime (头文件<ctime>

std::time_t ttmm= std::chrono::system_clock::to_time_t(now_point);
struct tm  *timeinfo = std::localtime(&ttmm);
char buf[24] = {0};
std::strftime(buf, 24, "%Y-%m-%d %H:%M:%S", timeinfo);
std::cout << buf << std::endl;

3、格式化输入

(1)C++风格 std::get_time(头文件<iomanip>

std::string time_str = "20230322171019";
std::istringstream ss(time_str);
struct tm time_struct;
ss >> std::get_time(&time_struct, "%Y%m%d%H%M%S");
time_t t_time = mktime(&time_struct);
auto time_point = std::chrono::system_clock::from_time_t(t_time);

(2)C风格strptime (头文件<ctime> or <time.h>

std::string time_str = "20230322171019";
strptime(time_str.c_str(), "%Y%m%d%H%M%S", &time_struct);
time_t t_time = mktime(&time_struct);
auto time_point = std::chrono::system_clock::from_time_t(t_time);

4、时间戳差(计算耗时性能)

auto start = std::chrono::steady_clock::now();
sleep(1);
auto end = std::chrono::steady_clock::now();

auto diff = end - start;
std::cout << std::chrono::duration<double>(diff).count() << "s" << std::endl;
std::cout << std::chrono::duration<double, std::milli>(diff).count() << "ms" << std::endl;
std::cout << std::chrono::duration<double, std::micro>(diff).count() << "us" << std::endl;
std::cout << std::chrono::duration<double, std::nano>(diff).count() << "ns" << std::endl;
### C++ 中 `chrono` 库的使用方法 #### 定义时间点和持续时间 `<chrono>` 头文件提供了多种类来处理时间和计时操作。主要组件包括: - **time_point**: 表示某个时刻的时间点。 - **duration**: 描述两个时间点之间的时间间隔。 ```cpp #include <iostream> #include <chrono> int main() { using namespace std::chrono; // 创建高精度时钟对象 high_resolution_clock::time_point t1 = high_resolution_clock::now(); // 执行一些耗时的操作... int sum = 0; for (long i = 0; i < 1e8; ++i) { sum += i; } // 记录结束时间 high_resolution_clock::time_point t2 = high_resolution_clock::now(); // 计算并打印所花费的时间 duration<double> time_span = duration_cast<duration<double>>(t2 - t1); std::cout << "It took me " << time_span.count() << " seconds." << std::endl; return 0; } ``` #### 使用预定义的时间单位 为了方便起见,标准库已经为常见的时间单位定义了别名,如秒、毫秒等。 ```cpp auto start_time = steady_clock::now(); // ... some code ... auto end_time = steady_clock::now(); milliseconds ms_int = duration_cast<milliseconds>(end_time - start_time); std::cout << "Time taken by function is : " << ms_int.count() << " milliseconds" << '\n'; ``` #### 设置定时器 可以利用 `this_thread::sleep_for()` 函数让线程暂停指定的一段时间。 ```cpp using namespace std::literals::chrono_literals; for(int i=0;i<5;++i){ cout<<"Tick\n"; this_thread::sleep_for(1s); // 每隔一秒输出一次 Tick } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值