核心 API ()
| 函數/結構體 | 作用 |
| `time_t time(time_t *t)` |
獲取當前日曆時間 (自 1970-01-01 00:00:00 UTC 秒數) |
| `struct tm *localtime(const time_t *t)` |
轉換為本地時間分量 (年/月/日/時/分/秒/星期/年間天數/夏令時) |
| `struct tm *gmtime(const time_t *t)` |
轉換為 UTC 時間 |
| `char *asctime(const struct tm *tm)` |
格式化為固定字符串 "Wed Jan 06 10:30:45 2027\n\0" |
| `size_t strftime(char *s, size_t max, const char *fmt, const struct tm *tm)` |
**自定義格式化** (核心),返回寫入字符數 |
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] (0=1月) **注意 +1**
int tm_year; // 年 (從1900起) **注意 +1900**
int tm_wday; // 星期 [0,6] (0=星期日)
int tm_yday; // 年間天數 [0,365]
int tm_isdst; // 夏令時標志
};
創建以日期命名文件完整代碼
#include
#include
#include
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
if (!local) { perror("localtime"); return 1; }
char filename[64];
// 格式: YYYYMMDD_HHMMSS.txt (排序友好、無非法字符)
size_t len = strftime(filename, sizeof(filename),
"%Y%m%d_%H%M%S.txt", local);
if (len == 0) { fprintf(stderr, "strftime 緩衝區不足\n"); return 1; }
FILE *fp = fopen(filename, "w");
if (!fp) { perror("fopen"); return 1; }
fprintf(fp, "文件創建時間: %s\n", asctime(local));
fclose(fp);
printf("已創建文件: %s\n", filename);
return 0;
}
常用 strftime 格式字符
| 格式 | 含義 | 示例 |
| `%Y` | 四位年份 | 2027 |
| `%m` | 兩位月份 (01-12) | 01 |
| `%d` | 兩位日期 (01-31) | 06 |
| `%H` | 24制小時 (00-23) | 10 |
| `%M` | 分鐘 (00-59) | 30 |
| `%S` | 秒 (00-60) | 45 |
| `%F` | 等價 `%Y-%m-%d` | 2027-01-06 |
| `%T` | 等價 `%H:%M:%S` | 10:30:45 |
| `%s` | Unix 時間戳 (秒) | 1704507045 |
跨平台注意事項
- Windows `fopen` 不支持 UTF-8 文件名 (需 `_wfopen` + 寬字符),但純 ASCII 日期格式無影響。
- 文件系統禁用字符:Windows `< > : " / \ | ? *`,Linux 僅 `/` 和 `\0`,上述 `%Y%m%d_%H%M%S` 全平台安全。
- 線程安全:`localtime` 返回靜態緩衝區指針,**多線程環境用 `localtime_r` (POSIX) 或 `localtime_s` (C11/Windows)**。
線程安全版本 (C11)
struct tm local;
if (localtime_s(&local, &now) != 0) { /* error */ }
strftime(filename, sizeof(filename), "%Y%m%d_%H%M%S.txt", &local);