1. 需求
在日志中输出精确到毫秒级的时间戳,
格式为:%Y-%m-%d %H:%M:%S.%MS
如:2024-05-30 22:33:25.821
2. 代码实现
#include <iostream>
#include <chrono>
#include <iomanip>
#include <sstream>
#include <ctime>
std::string getCurrentTimeStampMs()
{
// 获取当前时间
auto now = std::chrono::system_clock::now();
// 转换成time_t
auto time_t_now = std::chrono::system_clock::to_time_t(now);
// 转换为tm结构来获取日期和时间
std::tm local_time;
#ifdef _WIN32
localtime_s(&local_time, &time_t_now);
#else
localtime_r(&time_t_now, &local_time);
#endif
// 返回当前时间与纪元之间的时间间隔
auto duration_since_epoch = now.time_since_epoch();
// 将时间间隔转换为毫秒表示,得到毫秒数
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration_since_epoch).count();
// 获取毫秒部分
auto milliseconds = millis % 1000;
// 构造一个字符串流来格式化输出
std::ostringstream oss;
oss << std::put_time(&local_time, "%Y-%m-%d %H:%M:%S");
oss << "." << std::setfill('0') << std::setw(3) << milliseconds;
return oss.str();
}
int main() {
std::cout << getCurrentTimeStampMs() << std::endl;
std::cout << getCurrentTimeStampMs() << std::endl;
return 0;
}
输出
3.总结
3.1 time_t
time_t 是 C 和 C++ 中用于表示时间的类型,通常被定义为整数类型(通常是 long 或 long long)。它通常表示从某个固定的时间点(通常是 1970 年 1 月 1 日的午夜,也称为 Unix 纪元)经过的秒数,精确度只有秒级。
3.2 std::chrono::system_clock
std::chrono::system_clock
是 C++11 中的一个时钟类,用于表示系统时钟。它是 C++ 标准库提供的一种高精度时钟,可以用来测量时间间隔、获取当前时间等操作。
std::chrono::system_clock
的精度取决于操作系统和编译器的实现,通常精确到纳秒级别。它提供了一系列的成员函数,用于获取当前时间、转换时间点、计算时间差等操作。
以下是一些 std::chrono::system_clock
的常用成员函数:
now()
: 返回当前时钟的当前时间点。to_time_t()
: 将时间点转换为time_t
类型,以便与 C 的时间操作函数兼容。from_time_t()
: 将time_t
类型转换为时间点。time_since_epoch()
: 返回时间点与纪元之间的时间间隔。to_utc_time()
: 将时间点转换为 UTC 时间。from_utc_time()
: 将 UTC 时间转换为时间点。
以下是一个简单的示例,演示了如何使用 std::chrono::system_clock
获取当前时间:
#include <iostream>
#include <chrono>
int main() {
// 获取当前时间点
auto now = std::chrono::system_clock::now();
// 将时间点转换为 time_t 类型
std::time_t now_time_t = std::chrono::system_clock::to_time_t(now);
// 打印当前时间
std::cout << "Current time: " << std::ctime(&now_time_t);
return 0;
}