chrono使用場景舉例
1 輸出格式化字符串
示例代碼
auto now = std::chrono::system_clock::now();
auto t = std::chrono::system_clock::to_time_t(now);
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;std::ostringstream oss;
oss << std::put_time(std::localtime(&t), "%F %T")<< "." << std::setw(3) << std::setfill('0') << ms.count();
這段代碼使用C++11的<chrono>
庫獲取當前時間并生成帶毫秒的時間戳字符串。
- 獲取當前時間點
auto now = std::chrono::system_clock::now();
system_clock::now()
: 獲取當前系統時間點(UTC時間)- 返回類型:
std::chrono::system_clock::time_point
- 轉換為C風格時間
auto t = std::chrono::system_clock::to_time_t(now);
to_time_t()
: 將time_point
轉換為time_t
(自1970-01-01起經過的秒數)- 用于后續調用傳統C時間函數
- 提取毫秒部分
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
time_since_epoch()
: 獲取從時鐘紀元到now
的時間間隔duration_cast<milliseconds>
: 將時間間隔轉換為毫秒精度% 1000
: 取模運算獲取當前秒內的毫秒數(0-999)
- 格式化輸出
oss << std::put_time(std::localtime(&t), "%F %T") << "." << std::setw(3) << std::setfill('0') << ms.count();
localtime(&t)
: 將time_t
轉換為本地時間的tm
結構put_time(..., "%F %T")
: 格式化為YYYY-MM-DD HH:MM:SS
%F
等價于%Y-%m-%d
%T
等價于%H:%M:%S
ms.count()
: 獲取毫秒數值(整數)setw(3)
+setfill('0')
: 確保毫秒固定3位(如5→"005")
最終輸出格式
YYYY-MM-DD HH:MM:SS.sss
示例:2023-10-05 14:30:45.123
注意事項
-
線程安全性:
std::localtime
不是線程安全的(使用靜態緩沖區)。多線程環境下應改用:std::tm tm_buf; localtime_r(&t, &tm_buf); // POSIX // 或 localtime_s(&tm_buf, &t); // Windows
-
C++20替代方案:
C++20的<chrono>
庫提供更簡潔的時間格式化:auto now = std::chrono::system_clock::now(); return std::format("{:%Y-%m-%d %H:%M:%S}", now);
-
精度控制:
當前代碼精確到毫秒,如需微秒/納秒:// 微秒示例 auto us = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()) % 1000000;