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

C語言獲取系統時間的多種方式與精度對比

     編輯:關於C語言

標準 C 庫函數

函數精度說明
time()秒從 1970-01-01 秒數,time_t 通常為長整型
clock()~微秒CPU 時間,非牆鐘時間,精度 CLOCKS_PER_SEC
difftime()秒兩 time_t 差值,回傳 double

POSIX 高精度

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv, NULL);      // 秒 tv_sec + 微秒 tv_usec
// 精度 ~1 微秒,但系統調用開銷較大

// 更現代:clock_gettime (POSIX.1-2001)
#include <time.h>
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);   // 奈秒級牆鐘時間
clock_gettime(CLOCK_MONOTONIC, &ts);  // 單調時鐘,不受系統時間調整影響,適合計時

Windows API

// 毫秒級
DWORD GetTickCount();           // 系統啟動後毫秒,49.7 天溢位
DWORD GetTickCount64();         // 64 位,不溢位

// 高精度效能計數器
LARGE_INTEGER freq, start, end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
// ... 代碼 ...
QueryPerformanceCounter(&end);
double elapsed_ms = (end.QuadPart - start.QuadPart) * 1000.0 / freq.QuadPart;

// 多媒體計時器 (較舊)
timeBeginPeriod(1);  // 設定 1ms 精度
DWORD t = timeGetTime(); // 約 1ms 精度
timeEndPeriod(1);

MFC/ATL 封裝

CTime t = CTime::GetCurrentTime();  // 秒級
CTimeSpan span = t - t0;            // 時間差
SYSTEMTIME st;
GetLocalTime(&st);                  // 含毫秒 wMilliseconds

格式化輸出範例

time_t raw = time(NULL);
struct tm *info = localtime(&raw);
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", info);
printf("%s\n", buf);

選擇指南

  • 日誌時間戳:time() + localtime/gmtime + strftime。
  • 程式效能分析:clock_gettime(CLOCK_MONOTONIC) 或 QueryPerformanceCounter。
  • 簡單延遲/超時:GetTickCount64 (Win) / clock_gettime (Linux)。
  • 跨平台庫:建議封裝統一介面,內部按平台分派。

常見誤區

  1. clock() 測量牆鐘時間 → 錯誤,它測 CPU 時間,多執行緒會加總。
  2. GetTickCount 溢位 → 長時間運行程式必須用 GetTickCount64。
  3. time_t 32 位系統 2038 年溢位 → 用 64 位 time_t 或 int64_t。
  4. 直接相減 time_t 計算差值 → 應用 difftime 避免無號溢位。
  5. 理解各時間 API 的語義(牆鐘 vs CPU、單調 vs 可調)、精度與平台差異,是編寫正確計時、日誌、排程代碼的前提。

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