c++ 处理系统时间用 time.h还是标准库
作者:野牛程序员:2025-12-22 12:05:48 C++阅读 2111
c++ 处理系统时间用 time.h还是标准库
在 C++ 中处理系统时间,通常存在两条技术路线:传统的 time.h(C 风格)与现代 C++ 标准库(<chrono>)。两者各有适用场景,但在新项目中取舍非常明确。
一、time.h(C 风格时间接口)
来源
源自 C 语言
C++ 依然兼容并可直接使用
常用类型与函数
time_tstruct tmtime()localtime() / gmtime()strftime()
特点
接口简单,上手成本低
表达能力有限,仅支持“秒级”时间
类型安全性较弱,容易混用
不适合复杂时间计算与高精度场景
适合场景
C / C++ 混合项目
老代码维护
简单获取当前时间并格式化输出
二、C++ 标准库 <chrono>(强烈推荐)
引入版本
C++11:基础时间点与时钟
C++14 / C++17:逐步完善
C++20:时间库趋于完整(日期、时区)
核心概念
std::chrono::duration(时间长度)std::chrono::time_point(时间点)std::chrono::system_clockstd::chrono::steady_clockstd::chrono::high_resolution_clock
特点
强类型设计,避免单位混乱
支持纳秒级精度
时间计算安全、清晰、可组合
与现代 C++ 风格完全一致
适合场景
新项目
竞赛、工程、教学
需要时间计算、计时、性能分析
三、两种方式对比总结
| 对比维度 | time.h | <chrono> |
|---|---|---|
| 标准级别 | C / 旧 C++ | 现代 C++ |
| 精度 | 秒级 | 纳秒级 |
| 类型安全 | 较弱 | 很强 |
| 可读性 | 一般 | 清晰 |
| 未来兼容 | 不推荐扩展 | 官方主流方向 |
四、结论
新项目 / 教学 / 竞赛:优先选择
<chrono>旧项目维护 / 兼容 C 接口:可继续使用
time.h长期维护代码:避免继续引入
time.h
一、time.h 示例
1️⃣ 获取当前时间并格式化输出
#include <iostream>
#include <ctime>
int main() {
time_t now = time(nullptr); // 获取当前时间(秒)
tm *lt = localtime(&now); // 转换为本地时间
char buf[32];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt);
std::cout << buf << std::endl;
return 0;
}特点
精度为秒
接口偏 C 风格
指针与结构体混用,安全性一般
二、<chrono> 示例(推荐)
2️⃣ 获取当前系统时间(C++11 起)
#include <iostream>
#include <chrono>
int main() {
auto now = std::chrono::system_clock::now();
auto sec = std::chrono::system_clock::to_time_t(now);
std::cout << std::ctime(&sec);
return 0;
}3️⃣ 高精度计时(常用于算法、性能测试)
#include <iostream>
#include <chrono>
int main() {
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 1000000; ++i) {}
auto end = std::chrono::high_resolution_clock::now();
auto cost = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "耗时: " << cost.count() << " 微秒" << std::endl;
return 0;
}4️⃣ 获取毫秒级时间戳(常用于日志)
#include <iostream>
#include <chrono>
int main() {
auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch()
);
std::cout << ms.count() << std::endl;
return 0;
}野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

