在C++开发中,获取系统时间是很多功能实现的基础,比如日志记录、性能统计、定时任务等场景都需要用到系统时间。C++提供了多套时间处理接口,不同接口的适用场景和返回格式各有不同,开发者可以根据需求选择合适的方法。

C标准库时间函数获取系统时间
C++兼容C标准库的时间处理函数,这类方法使用较为广泛,适合需要获取时间戳或者简单时间字符串的场景。
使用time函数获取时间戳
time函数可以获取当前系统的日历时间,返回的是从1970年1月1日00:00:00 UTC到当前时刻的秒数,类型为time_t。
#include <iostream>
#include <ctime>
int main() {
// 获取当前时间戳
time_t now_time = time(nullptr);
std::cout << "当前时间戳(秒): " << now_time << std::endl;
return 0;
}
将时间戳转换为可读时间
获取到time_t类型的时间戳后,可以使用localtime函数将其转换为本地时间,或者使用gmtime转换为UTC时间,转换后得到tm结构体,包含年、月、日、时、分、秒等详细信息。
#include <iostream>
#include <ctime>
int main() {
time_t now_time = time(nullptr);
// 转换为本地时间
tm* local_tm = localtime(&now_time);
// 转换为UTC时间
tm* utc_tm = gmtime(&now_time);
// 输出本地时间
std::cout << "本地时间: "
<< (local_tm->tm_year + 1900) << "年"
<< (local_tm->tm_mon + 1) << "月"
<< local_tm->tm_mday << "日 "
<< local_tm->tm_hour << ":"
<< local_tm->tm_min << ":"
<< local_tm->tm_sec << std::endl;
return 0;
}
注意tm结构体的tm_year是从1900年开始计算的,所以需要加1900得到实际年份;tm_mon是从0开始计数的,所以需要加1得到实际月份。
格式化时间字符串
可以使用strftime函数将tm结构体的时间按照指定格式转换为字符串,满足不同的时间展示需求。
#include <iostream>
#include <ctime>
int main() {
time_t now_time = time(nullptr);
tm* local_tm = localtime(&now_time);
char time_str[64];
// 格式化时间,格式为年-月-日 时:分:秒
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", local_tm);
std::cout << "格式化本地时间: " << time_str << std::endl;
return 0;
}
C++11 chrono库获取系统时间
C++11引入了chrono时间库,提供了更现代、类型更安全的时间处理接口,适合需要高精度时间或者时间间隔计算的场景。
获取当前时间点
chrono库中的system_clock可以获取系统的当前时间点,通过time_since_epoch方法可以获取该时间点到时钟纪元的时长。
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
// 获取当前时间点
auto now = std::chrono::system_clock::now();
// 转换为time_t类型的时间戳
time_t now_time = std::chrono::system_clock::to_time_t(now);
std::cout << "chrono获取的时间戳: " << now_time << std::endl;
return 0;
}
获取高精度时间
如果需要更高精度的时间,比如毫秒、微秒级别,可以使用chrono库的duration相关接口,适合计算程序运行耗时等场景。
#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 duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "操作耗时: " << duration.count() << " 毫秒" << std::endl;
return 0;
}
两种方法的对比与选择
下面通过表格对比两种获取系统时间的方法,帮助开发者选择合适的方案:
| 对比项 | C标准库时间函数 | C++11 chrono库 |
|---|---|---|
| 兼容性 | 兼容所有C++版本,甚至C语言 | 需要C++11及以上版本支持 |
| 精度 | 通常为秒级 | 支持纳秒、微秒、毫秒等高精度 |
| 类型安全 | 弱类型,time_t、tm等类型定义不统一 | 强类型,不同时间单位有明确类型区分 |
| 适用场景 | 简单时间戳获取、时间字符串格式化 | 高精度计时、时间间隔计算、现代C++项目 |
注意事项
- localtime和gmtime函数返回的指针指向的是静态内存区域,多线程环境下使用可能存在线程安全问题,建议使用localtime_r(Linux)或localtime_s(Windows)的线程安全版本。
- chrono库的时钟类型中,system_clock的时间是可以和日历时间转换的,而steady_clock是单调时钟,适合计算时间间隔,不要用来获取系统日历时间。
- 处理时间字符串时,注意不同平台的编码差异,避免中文时间展示出现乱码问题。