C++ 日期 & 时间详解
在 C++ 中,日期和时间处理主要依赖于 C 标准库 <ctime> 和 C++11 引入的 <chrono>。这两者提供了不同的时间管理方式:
<ctime>:基于 C 语言,使用time_t、tm结构体,提供基本的日期和时间操作。<chrono>(C++11+):提供更强大的时间处理功能,包括高精度计时和时间单位转换。
1. C 语言风格的日期 & 时间(<ctime> 头文件)
1.1 time_t 获取当前时间
time_t 是一个整数类型,表示自 1970 年 1 月 1 日 00:00:00 UTC(Unix 时间)以来的秒数。
#include <iostream>
#include <ctime>
int main() {
time_t now = time(0); // 获取当前时间
std::cout << "当前时间戳: " << now << std::endl;
return 0;
}
1.2 tm 结构体解析时间
tm 结构体用于存储解析后的时间数据:
| 成员变量 | 说明 | 取值范围 |
|---|---|---|
tm_sec | 秒(0 – 59) | 0-59 |
tm_min | 分(0 – 59) | 0-59 |
tm_hour | 小时(0 – 23) | 0-23 |
tm_mday | 一个月中的日期(1 – 31) | 1-31 |
tm_mon | 月份(0 – 11,0 表示 1 月) | 0-11 |
tm_year | 自 1900 年以来的年数 | 1900+ |
tm_wday | 一周中的天数(0 – 6,0 是周日) | 0-6 |
tm_yday | 一年中的天数(0 – 365) | 0-365 |
本地时间 localtime()
#include <iostream>
#include <ctime>
int main() {
time_t now = time(0);
tm* localTime = localtime(&now);
std::cout << "本地时间: "
<< localTime->tm_year + 1900 << "-"
<< localTime->tm_mon + 1 << "-"
<< localTime->tm_mday << " "
<< localTime->tm_hour << ":"
<< localTime->tm_min << ":"
<< localTime->tm_sec << std::endl;
return 0;
}
UTC 时间 gmtime()
tm* utcTime = gmtime(&now);
区别:
localtime()返回本地时区的时间。gmtime()返回 UTC 时间(零时区时间)。
1.3 格式化时间 asctime() 和 strftime()
(1)asctime()
#include <iostream>
#include <ctime>
int main() {
time_t now = time(0);
tm* localTime = localtime(&now);
std::cout << "格式化时间: " << asctime(localTime); // e.g., Sat Mar 30 14:23:45 2025
return 0;
}
(2)strftime() 自定义格式
#include <iostream>
#include <ctime>
int main() {
time_t now = time(0);
tm* localTime = localtime(&now);
char buffer[80];
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", localTime);
std::cout << "自定义格式时间: " << buffer << std::endl;
return 0;
}
常见格式符:
| 格式 | 说明 |
|---|---|
%Y | 4 位年份,如 2025 |
%m | 月份(01-12) |
%d | 日(01-31) |
%H | 小时(00-23) |
%M | 分钟(00-59) |
%S | 秒(00-59) |
%A | 完整星期名,如 “Sunday” |
%B | 完整月份名,如 “March” |
2. C++11 <chrono> 高精度时间
C++11 引入了 <chrono>,提供更精确的时间管理,包括:
std::chrono::system_clock(系统时钟)std::chrono::steady_clock(单调时钟)std::chrono::high_resolution_clock(高精度时钟)
2.1 获取当前时间点
#include <iostream>
#include <chrono>
int main() {
auto now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::cout << "当前时间: " << std::ctime(&now_c);
return 0;
}
2.2 计算时间间隔
(1)测量代码执行时间
#include <iostream>
#include <chrono>
#include <thread>
int main() {
auto start = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "代码执行时间: " << elapsed.count() << " 秒" << std::endl;
return 0;
}
(2)单位转换
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
milliseconds ms(5000); // 5000 毫秒
seconds sec = duration_cast<seconds>(ms); // 转换为秒
std::cout << "5000 毫秒 = " << sec.count() << " 秒" << std::endl;
return 0;
}
3. 日期 & 时间的常见应用
3.1 生成时间戳
#include <iostream>
#include <chrono>
int main() {
auto now = std::chrono::system_clock::now();
auto duration = now.time_since_epoch();
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
std::cout << "当前时间戳(毫秒): " << millis.count() << std::endl;
return 0;
}
3.2 获取当前日期
#include <iostream>
#include <ctime>
int main() {
time_t now = time(0);
tm* localTime = localtime(&now);
char buffer[20];
strftime(buffer, 20, "%Y-%m-%d", localTime);
std::cout << "今天日期: " << buffer << std::endl;
return 0;
}
4. 总结
| 方式 | 适用场景 |
|---|---|
<ctime>(C 方式) | 适合简单时间操作,如时间戳、本地时间 |
<chrono>(C++11+) | 适合高精度计时、时间间隔计算、单位转换 |
推荐:
- 如果只是获取当前时间、时间戳,可以用
<ctime>。 - 如果需要高精度定时、时间计算,建议用
<chrono>。
更多详细内容请关注其他相关文章!