函式簽名
#include
std::time_t time(std::time_t* arg); // C++11 起可用 nullptr
回傳值含義
- 型別:
std::time_t(通常為 64 位元有號整數)
- 意義:從 Unix 紀元 (1970-01-01 00:00:00 UTC) 到目前的 秒數
- 精度:秒級,不含毫秒/微秒
常見問題 Q&A
| 問題 | 答案 |
| 執行幾毫秒的程式,回傳值會變嗎? | 可能。若剛好跨越秒邊界(如 10:00:00.998 → 10:00:01.002),兩次呼叫會差 1 秒。 |
| 如何取得毫秒精度? | 使用 std::chrono::system_clock::now() (C++11) 或平台 API (GetTickCount64, clock_gettime)。 |
| time_t 是有號還是無號? | 標準規定為算術型別,實作多為有號 64 位元,支援 2038 年問題後的日期。 |
| 如何轉為可讀字串? | std::ctime(&t)、std::strftime、std::put_time (C++11)。 |
程式碼範例
#include
#include
#include
int main() {
// C 風格
std::time_t t = std::time(nullptr);
std::cout << "秒數: " << t << '\n';
std::cout << "時間: " << std::ctime(&t);
// C++11 高精度
auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast(now.time_since_epoch()).count();
std::cout << "毫秒數: " << ms << '\n';
}
最佳實務
- ✅ 僅需「日期/秒級日誌」用
time()
- ✅ 需「效能計時、毫秒級時間戳」用
std::chrono
- ✅ 跨平台儲存時間戳:統一用 UTC 秒數或 ISO 8601 字串