首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C/C++ 時間函數完全指南:從 time_t 到 chrono 的跨平台時間處理

     編輯:C++ 入門

時間概念澄清

  • UTC:協調世界時,等同 GMT,中國為 UTC+8
  • Calendar Time:從 Epoch(1970-01-01 00:00:00 UTC)起經過的秒數,time_t 類型
  • Epoch:時間原點,系統相關但進程內固定
  • Clock Tick:CPU 時鐘計時單元,CLOCKS_PER_SEC 通常 1000000(微秒)或 1000(毫秒)

C 標準庫 核心

時間獲取


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:%S
  • strptime:解析字符串填充 tm(POSIX,Windows 需手寫)

高精度計時


clock_t start = clock();
// ... 代碼段 ...
clock_t end = clock();
double ms = (end - start) * 1000.0 / CLOCKS_PER_SEC;

C++11 庫:類型安全、精度可擴展

核心類型

  • 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 / Howard Hinnant's date 庫)


// 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());

跨平台最佳實踐

  1. 存儲統一用 UTC time_t 或 int64_t 毫秒數,避免時區混淆。
  2. 業務邏輯用 steady_clock 計時,防 NTP 調時導致負耗時。
  3. 格式化輸出用 date.h 或 C++20,手寫 strftime 易錯。
  4. 解析輸入用 date::parse 或 strptime,嚴格校驗格式。
  5. 定時器用 steady_clock + condition_variable,而非 sleep(秒數)。

常見坑點

  1. time_t 32 位系統 2038 年溢出,用 int64_t 存儲。
  2. localtime 返回靜態緩衝區,多線程必用 localtime_r 或 std::get_time。
  3. mktime 修改輸入 tm 結構體(標準化字段),調用前備份。
  4. 夏令時切換日存在「不存在時間」(春季跳時)與「重複時間」(秋季回撥),mktime 自動處理但需測試。

總結

C/C++ 時間處理經歷了 time.h(C 風格、易錯)到 chrono(類型安全、可組合)的演進。現代代碼應:
• 存儲/傳輸用 int64_t UTC 毫秒
• 計時用 steady_clock
• 顯示/解析用 date.h/C++20 chrono
• 彌補平台差異封裝統一 TimeUtil 庫

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved