核心數據類型
| 類型 | 定義 | 說明 |
time_t | 長整型 | 自1970-01-01 00:00:00 UTC至今的秒數(時間戳) |
struct tm | 結構體 | 分解的日曆時間:年、月、日、時、分、秒、星期、儒略日、夏令時標誌 |
struct timeval | 結構體 | 微秒精度:tv_sec秒 + tv_usec微秒 |
struct timezone | 結構體 | 時區信息:與格林威治時間差(分鐘)、夏令時狀態 |
關鍵函數速查表
| 函數 | 功能 | 備註 |
time() | 獲取當前時間戳 | 參數為time_t*可同步寫入 |
ctime() | 時間戳→本地時間字符串 | 格式固定:"Wed Jun 30 21:49:08 1993\n" |
asctime() | tm結構→字符串 | 同ctime格式,輸入為分解時間 |
gmtime() | 時間戳→UTC分解時間 | 返回靜態tm*,非線程安全 |
localtime() | 時間戳→本地分解時間 | 自動應用時區/夏令時 |
mktime() | tm結構→時間戳 | 修正字段溢出(如月份13→次年1月) |
gettimeofday() | 獲取微秒級時間 | POSIX標準,需sys/time.h |
settimeofday() | 設置系統時間 | 需root權限 |
實戰代碼片段
獲取格式化本地時間
time_t now = time(NULL);
struct tm *lt = localtime(&now);
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt);
printf("Local: %s\n", buf);
高精度計時
struct timeval tv;
gettimeofday(&tv, NULL);
long long ms = tv.tv_sec * 1000LL + tv.tv_usec / 1000;
時間差計算
time_t start = time(NULL);
// ... 執行任務 ...
time_t end = time(NULL);
double diff = difftime(end, start); // 秒數,double精度
常見坑點與最佳實踐
- 線程安全:
gmtime/localtime/ctime/asctime返回靜態緩衝區,多線程環境下使用gmtime_r/localtime_r(POSIX)或_localtime64_s(Windows)
- 年份偏移:
tm_year為距1900年的偏移,tm_mon為0-11,輸出時需+1900、+1
time_t在32位系統2038年溢出,長期項目建議用int64_t或time64_t
- 跨平台項目優先使用
chrono(C++11)或封裝平台差異層