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

C語言日期時間處理完全指南:time.h核心API詳解與實戰

     編輯:關於C

核心數據類型

類型定義說明
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)或封裝平台差異層
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved