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

C 語言時間處理完全指南:time_t、tm 結構、格式化與微秒級定時

     編輯:關於C語言

C 語言時間處理完全指南:time_t、tm 結構、格式化與微秒級定時

核心數據類型

time_t:日曆時間,自紀元(1970-01-01 00:00:00 UTC)至今的秒數(通常為有符號 64 位整數)。

struct tm:分解時間(日曆時間分量):

struct tm {
    int tm_sec;   // 秒 [0,59]
    int tm_min;   // 分 [0,59]
    int tm_hour;  // 時 [0,23]
    int tm_mday;  // 日 [1,31]
    int tm_mon;   // 月 [0,11]  0=一月
    int tm_year;  // 年-1900    如 2024 → 124
    int tm_wday;  // 星期 [0,6] 0=週日
    int tm_yday;  // 年內天數 [0,365]
    int tm_isdst; // 夏令時標誌 >0生效 =0不生效 <0未知
};

時間獲取與轉換函數

函數功能返回值
time(time_t *t)獲取當前日曆時間time_t(同參數輸出)
localtime(const time_t *t)轉為本地時間 tmstruct tm* 靜態緩衝區
gmtime(const time_t *t)轉為 UTC 時間 tmstruct tm* 靜態緩衝區
mktime(struct tm *tm)本地 tm → time_t(修正字段)time_t,錯誤返回 -1
asctime(const struct tm *tm)tm → 固定格式字符串char* "Www Mmm dd hh:mm:ss yyyy\n"
ctime(const time_t *t)等價 asctime(localtime(t))char*

實例:打印本地時間

#include <stdio.h> #include <time.h>

int main() {
    time_t now = time(NULL);
    struct tm *lt = localtime(&now);
    char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
    printf("%d/%02d/%02d %s %02d:%02d:%02d\n",
           1900+lt->tm_year, lt->tm_mon+1, lt->tm_mday,
           wday[lt->tm_wday],
           lt->tm_hour, lt->tm_min, lt->tm_sec);
    return 0;
}
// 輸出:2024/06/03 Fri 21:25:34

strftime:自定義格式化輸出

size_t strftime(char *buf, size_t max, const char *fmt, const struct tm *tm)

char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt);
printf("now = %s\n", buf);  // 2024-06-03 21:23:07

常用格式佔位符

符號含義示例
%Y完整年份2024
%m兩位月份06
%d兩位日期03
%H24制時21
%M分23
%S秒07
%F%Y-%m-%d 簡寫2024-06-03
%T%H:%M:%S 簡寫21:23:07
%A / %a星期全稱/縮寫Monday / Mon
%B / %b月份全稱/縮寫June / Jun
%z / %Z時區偏移/名稱+0800 / CST

微秒級時間:gettimeofday()

int gettimeofday(struct timeval *tv, struct timezone *tz)(POSIX,非標準 C)

struct timeval {
    time_t tv_sec;      // 秒
    suseconds_t tv_usec; // 微秒
};
struct timezone {       // 通常傳 NULL 忽略
    int tz_minuteswest; // UTC 西偏分鐘
    int tz_dsttime;     // 夏令時類型
};
#include <sys/time.h> #include <stdio.h> #include <unistd.h>

int main() {
    struct timeval tv;
    for (int i = 0; i < 4; i++) {
        gettimeofday(&tv, NULL);
        printf("sec=%ld  usec=%ld\n", tv.tv_sec, tv.tv_usec);
        sleep(1);
    }
    return 0;
}

時間測量技巧

  • 程序運行耗時:time ./prog > out 查看 real/user/sys。real = user + sys + wait
  • 高精度計時:clock_gettime(CLOCK_MONOTONIC, &ts)(納秒級,Linux 專用,不受系統時間調整影響)
  • 日志文件命名:strftime(fname, sizeof(fname), "log_%Y%m%d_%H%M%S.txt", lt)

線程安全變體

localtime_r、gmtime_r、ctime_r、asctime_r 接受用戶提供的 struct tm 緩衝區,避免靜態緩衝區競態。

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