time_t 類型CLOCKS_PER_SEC 通常 1000000(微秒)或 1000(毫秒)
time_t now = time(nullptr); // 日歷時間
clock_t cpu = clock(); // 進程 CPU 時間(clock ticks)
struct tm
struct tm {
int tm_sec; // 0-60
int tm_min; // 0-59
int tm_hour; // 0-23
int tm_mday; // 1-31
int tm_mon; // 0-11
int tm_year; // 年份-1900
int tm_wday; // 0-6 (Sun=0)
int tm_yday; // 0-365
int tm_isdst; // 夏令時標誌
};
gmtime:time_t → UTC tm(非線程安全)localtime:time_t → 本地時區 tm(非線程安全)gmtime_r/localtime_r:線程安全版(POSIX)mktime:本地 tm → time_t(自動修正字段、處理夏令時)strftime:格式化輸出,%Y-%m-%d %H:%M:%Sstrptime:解析字符串填充 tm(POSIX,Windows 需手寫)
clock_t start = clock();
// ... 代碼段 ...
clock_t end = clock();
double ms = (end - start) * 1000.0 / CLOCKS_PER_SEC;
duration:時間長度(如 milliseconds, nanoseconds)time_point:時間點(相對於 Clock::epoch)system_clock:系統實時鐘(可映射 time_t)steady_clock:單調時鐘(不受系統時間調整影響,適合計時)high_resolution_clock:最高精度時鐘(通常 alias steady_clock)
auto now = system_clock::now();
time_t tt = system_clock::to_time_t(now);
auto ms = duration_cast(now.time_since_epoch()).count();
// 計時代碼段
auto t1 = steady_clock::now();
/* ... */
auto t2 = steady_clock::now();
cout << "Elapsed: " << duration_cast(t2-t1).count() << " µs\n";
// 時間點運算
auto tomorrow = now + 24h; // C++20 支持 24h 字面量,C++11 用 hours(24)
auto ms100 = 100ms; // C++14 字面量
// C++20
auto zt = zoned_time{"Asia/Shanghai", system_clock::now()};
cout << format("%F %T %Z", zt) << '\n';
// 當前廣泛使用 date.h (header-only)
#include "date/tz.h"
auto zt = date::make_zoned("Asia/Shanghai", system_clock::now());
time_t 32 位系統 2038 年溢出,用 int64_t 存儲。localtime 返回靜態緩衝區,多線程必用 localtime_r 或 std::get_time。mktime 修改輸入 tm 結構體(標準化字段),調用前備份。mktime 自動處理但需測試。C/C++ 時間處理經歷了 time.h(C 風格、易錯)到 chrono(類型安全、可組合)的演進。現代代碼應:
• 存儲/傳輸用 int64_t UTC 毫秒
• 計時用 steady_clock
• 顯示/解析用 date.h/C++20 chrono
• 彌補平台差異封裝統一 TimeUtil 庫