C++ 標準程式庫無內建日期型別,繼承 C 語言的 <ctime> 函式庫進行日期時間操作。核心型別包括 time_t(日曆時間)、clock_t(處理器時間)、tm 結構(分解時間)。
struct tm {
int tm_sec; // 秒 [0,61]
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年起)
int tm_wday; // 星期 [0,6] (0=星期日)
int tm_yday; // 年內天數 [0,365]
int tm_isdst; // 夏令時旗標
};
| 函式 | 說明 |
|---|---|
time_t time(time_t*) | 取得自 1970-01-01 00:00:00 UTC 至今的秒數 |
char* ctime(const time_t*) | 將 time_t 轉為可讀字串(本地時間) |
tm* localtime(const time_t*) | 轉為本地時間 tm 結構 |
tm* gmtime(const time_t*) | 轉為 UTC 時間 tm 結構 |
char* asctime(const tm*) | 將 tm 結構轉為可讀字串 |
time_t mktime(tm*) | 將 tm 結構轉為 time_t(並修正欄位) |
double difftime(time_t, time_t) | 計算兩時間差(秒) |
size_t strftime(...) | 格式化日期時間為指定字串 |
clock_t clock() | 取得程式啟動至今的處理器時鐘數 |
#include <iostream>
#include <ctime>
using namespace std;
int main() {
time_t now = time(0);
char* dt = ctime(&now);
cout << "本地日期時間:" << dt << endl;
tm* gmtm = gmtime(&now);
dt = asctime(gmtm);
cout << "UTC 日期時間:" << dt << endl;
return 0;
}
輸出範例:
本地日期時間:Sat Jan 8 20:07:41 2011 UTC 日期時間:Sun Jan 9 03:07:41 2011
#include <iostream>
#include <ctime>
using namespace std;
int main() {
time_t now = time(0);
cout << "自 1970 年秒數:" << now << endl;
tm* ltm = localtime(&now);
cout << "Year: " << 1900 + ltm->tm_year << endl;
cout << "Month: " << 1 + ltm->tm_mon << endl;
cout << "Day: " << ltm->tm_mday << endl;
cout << "Time: " << ltm->tm_hour << ":"
<< ltm->tm_min << ":" << ltm->tm_sec << endl;
return 0;
}
輸出範例:
自 1970 年秒數:1294548238 Year: 2011 Month: 1 Day: 8 Time: 22:44:59
依格式字串產生自訂日期時間字串,常用格式代碼:
%Y 四位數年、%m 雙位數月、%d 雙位數日%H 24制時、%M 分、%S 秒%c 標準日期時間表示char buffer[80];
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", ltm);
cout << "格式化:" << buffer << endl;
ctime/asctime 回傳靜態緩衝區指標,後續呼叫會覆蓋,需立即複製或使用。localtime/gmtime 亦回傳靜態 tm 指標,執行緒不安全;C++11 起可用 localtime_s/gmtime_s 或 <chrono> 現代化 API。tm_year 為距 1900 年數,tm_mon 0-11,輸出時需 +1900/+1。