C++中推荐使用std::chrono获取时间戳,它提供高精度、类型安全的现代方法;通过system_clock::now()获取当前时间点,再用duration_cast转换为秒、毫秒等整数时间戳。对于可读格式转换,需结合ctime库的to_time_t和localtime/gmtime,再用put_time或strftime格式化;反向解析则用get_time、mktime和from_time_t。多线程下应避免localtime非线程安全问题,改用localtime_r或C++20时区功能;测量间隔应使用steady_clock以保证单调性。

C++中获取系统时间戳,最现代且推荐的方式是使用C++11引入的
<chrono>
<ctime>
time_t
struct tm
在C++中,获取系统时间戳并进行转换,我们通常会围绕
std::chrono
std::ctime
使用 std::chrono
std::chrono::system_clock
立即学习“C++免费学习笔记(深入)”;
获取当前时间点:
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
转换为时间戳(例如,自Epoch以来的毫秒数或秒数): 时间点本身不是一个直接的整数时间戳,我们需要将其转换为自Unix Epoch(1970年1月1日00:00:00 UTC)以来的时间间隔(duration),然后获取其计数。
#include <iostream>
#include <chrono>
#include <ctime> // For std::time_t conversion later
// 获取秒级时间戳
long long timestamp_seconds = std::chrono::duration_cast<std::chrono::seconds>(
now.time_since_epoch()
).count();
// 获取毫秒级时间戳
long long timestamp_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch()
).count();
// 获取微秒级时间戳
long long timestamp_microseconds = std::chrono::duration_cast<std::chrono::microseconds>(
now.time_since_epoch()
).count();
// 获取纳秒级时间戳 (system_clock 的默认精度通常是微秒或纳秒,取决于系统)
long long timestamp_nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(
now.time_since_epoch()
).count();
std::cout << "秒级时间戳: " << timestamp_seconds << std::endl;
std::cout << "毫秒级时间戳: " << timestamp_milliseconds << std::endl;
std::cout << "微秒级时间戳: " << timestamp_microseconds << std::endl;
std::cout << "纳秒级时间戳: " << timestamp_nanoseconds << std::endl;使用 std::ctime
std::time_t
获取当前时间戳:
std::time_t now_c = std::time(nullptr);
std::time(nullptr)
转换为可读格式 (例如,struct tm
struct tm* local_time = std::localtime(&now_c);
struct tm* gmt_time = std::gmtime(&now_c);
std::localtime
std::gmtime
time_t
struct tm
localtime_r
localtime_s
从 struct tm
time_t
std::time_t re_converted_time = std::mktime(local_time);
std::mktime
struct tm
time_t
std::chrono
在我看来,
std::chrono
std::chrono::system_clock
system_clock::now()
time_point
time_point
system_clock
duration
要获取具体的时间戳值,我们需要将这个
duration
#include <iostream>
#include <chrono>
#include <iomanip> // For std::put_time
void print_high_res_timestamp() {
auto now = std::chrono::system_clock::now();
// 获取纳秒级时间戳
auto nanoseconds_since_epoch = std::chrono::duration_cast<std::chrono::nanoseconds>(
now.time_since_epoch()
).count();
std::cout << "当前纳秒级时间戳: " << nanoseconds_since_epoch << std::endl;
// 获取毫秒级时间戳
auto milliseconds_since_epoch = std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch()
).count();
std::cout << "当前毫秒级时间戳: " << milliseconds_since_epoch << std::endl;
// 获取秒级时间戳
auto seconds_since_epoch = std::chrono::duration_cast<std::chrono::seconds>(
now.time_since_epoch()
).count();
std::cout << "当前秒级时间戳: " << seconds_since_epoch << std::endl;
// 顺便提一下:system_clock 的精度可能不是真正的纳秒,但它会提供你能得到的最高精度
// 比如在某些系统上,它的最小刻度可能是微秒。duration_cast 会帮你处理精度转换。
// 如果你需要测量代码执行时间,而不是系统挂钟时间,你应该考虑使用 std::chrono::steady_clock。
// steady_clock 是单调递增的,不受系统时间调整的影响,非常适合计时。
// 比如:
// auto start = std::chrono::steady_clock::now();
// // ... 执行一些操作 ...
// auto end = std::chrono::steady_clock::now();
// auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
// std::cout << "操作耗时: " << elapsed_ms << " 毫秒" << std::endl;
}
// 调用示例
// print_high_res_timestamp();std::chrono::system_clock
duration_cast
duration_cast
将时间戳转换为人类可读的日期时间字符串,以及反向操作,是时间处理中非常常见的需求。
std::chrono
<ctime>
时间戳转换为日期时间字符串
这里我们以
std::chrono::system_clock::time_point
将 time_point
std::time_t
std::chrono
std::ctime
std::chrono::system_clock::to_time_t
将 std::time_t
struct tm
std::localtime
std::gmtime
使用 std::put_time
std::strftime
struct tm
std::put_time
std::cout
std::strftime
#include <iostream>
#include <chrono>
#include <ctime>
#include <iomanip> // For std::put_time
void timestamp_to_string_example() {
auto now_tp = std::chrono::system_clock::now();
// 1. 转换为 std::time_t
std::time_t now_c = std::chrono::system_clock::to_time_t(now_tp);
// 2. 转换为 struct tm (这里使用本地时间)
// 注意:localtime 返回的指针指向静态存储区,非线程安全。
// 在多线程环境应使用 localtime_r (POSIX) 或 localtime_s (Windows)
std::tm* local_tm = std::localtime(&now_c);
if (local_tm) {
// 3. 使用 std::put_time 格式化输出
std::cout << "当前本地时间 (YYYY-MM-DD HH:MM:SS): "
<< std::put_time(local_tm, "%Y-%m-%d %H:%M:%S") << std::endl;
// 也可以格式化为其他形式,比如带星期几
std::cout << "当前本地时间 (Full): "
<< std::put_time(local_tm, "%A, %B %d, %Y %H:%M:%S") << std::endl;
} else {
std::cerr << "无法获取本地时间信息。" << std::endl;
}
// 如果想获取UTC时间
std::tm* gmt_tm = std::gmtime(&now_c);
if (gmt_tm) {
std::cout << "当前UTC时间 (YYYY-MM-DD HH:MM:SS): "
<< std::put_time(gmt_tm, "%Y-%m-%d %H:%M:%S") << std::endl;
}
}
// 调用示例
// timestamp_to_string_example();日期时间字符串转换为时间戳
这个过程相对复杂一些,因为涉及到字符串解析。
使用 std::get_time
struct tm
std::get_time
std::put_time
struct tm
将 struct tm
std::time_t
std::mktime
将 std::time_t
std::chrono::system_clock::time_point
std::chrono::system_clock::from_time_t
#include <iostream>
#include <chrono>
#include <ctime>
#include <iomanip>
#include <sstream> // For std::istringstream
void string_to_timestamp_example() {
std::string time_str = "2023-10-27 10:30:00";
std::tm t = {}; // 初始化为零
// 1. 使用 std::get_time 解析字符串到 struct tm
std::istringstream ss(time_str);
ss >> std::get_time(&t, "%Y-%m-%d %H:%M:%S");
if (ss.fail()) {
std::cerr << "解析日期时间字符串失败: " << time_str << std::endl;
return;
}
// 2. 将 struct tm 转换为 std::time_t
// mktime 假定 t 是本地时间,并会根据本地时区调整
std::time_t time_c = std::mktime(&t);
if (time_c == -1) { // mktime 失败会返回 -1
std::cerr << "mktime 转换失败。" << std::endl;
return;
}
// 3. 将 std::time_t 转换为 std::chrono::system_clock::time_point
auto time_point = std::chrono::system_clock::from_time_t(time_c);
// 获取毫秒级时间戳并打印
long long timestamp_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
time_point.time_since_epoch()
).count();
std::cout << "字符串 \"" << time_str << "\" 转换为毫秒级时间戳: "
<< timestamp_ms << std::endl;
// 验证:再转回字符串看看
std::time_t check_c = std::chrono::system_clock::to_time_t(time_point);
std::tm* check_tm = std::localtime(&check_c);
if (check_tm) {
std::cout << "验证转换回字符串: "
<< std::put_time(check_tm, "%Y-%m-%d %H:%M:%S") << std::endl;
}
}
// 调用示例
// string_to_timestamp_example();需要注意的是,
std::get_time
std::put_time
date
在开发高性能或并发应用时,时间戳的获取和处理确实有一些细节需要特别关注。这不仅仅是关于代码是否能跑起来,更是关于它的正确性、效率和稳定性。
std::chrono::system_clock
std::chrono::steady_clock
system_clock
system_clock
std::chrono::steady_clock
steady_clock
// 测量代码块执行时间 auto start = std::chrono::steady_clock::now(); // ... 你的代码逻辑 ... auto end = std::chrono::steady_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "代码执行耗时: " << duration.count() << " 微秒" << std::endl;
C风格时间函数 (localtime
gmtime
std::localtime
std::gmtime
struct tm*
localtime_r
gmtime_r
struct tm
std::time_t now_c = std::time(nullptr); std::tm local_tm_buf; // 用户提供的缓冲区 localtime_r(&now_c, &local_tm_buf); // 线程安全 // 现在可以使用 local_tm_buf 了
localtime_s
gmtime_s
std::time_t now_c = std::time(nullptr); std::tm local_tm_buf; localtime_s(&local_tm_buf, &now_c); // 线程安全 // 现在可以使用 local_tm_buf 了
<chrono>
std::chrono::zoned_time
std::chrono::local_time
时间戳获取的开销 通常来说,获取当前时间戳(无论是
system_clock::now()
time(nullptr)
QueryPerformanceCounter
clock_gettime
以上就是如何在C++中获取系统时间戳_C++时间戳获取与转换的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号