1.介绍
C++中,处理时间的相关功能主要依赖于C标准库(如<ctime>)和C++11引入的<chrono>库。下面将详细介绍其相关用法。
2.用法
(1)C标准库(<ctime>)
C++继承了C语言的时间处理函数,定义在<ctime>头文件中。常用的函数和类型包括:
1.常用类型
time_t: 表示时间的数据类型,通常是一个整数。(从1970年1月1日00:00:00 UTC 到现在的秒数,即Unix时间戳)。
struct tm: 表示分解后的时间。(年、月、日、时、分、秒等)。
2.常用函数
time_t time(time_t* arg):
获取当前时间戳,存储在arg中。例如
#include <iostream>
#include <ctime>
int main() {
time_t now = time(nullptr);
std::cout << "当前时间戳: " << now << std::endl;
return 0;
}
struct tm *localtime(const time_t *timep):
将时间戳转换为本地时间(struct tm)。例如
#include <iostream>
#include <ctime>
int main() {
time_t now = time(nullptr);
struct tm *local_time = localtime(&now);
std::cout << "本地时间: " << local_time->tm_year + 1900 << "-"
<< local_time->tm_mon + 1 << "-"
<< local_time->tm_mday << " "
<< local_time->tm_hour << ":"
<< local_time->tm_min << ":"
<< local_time->tm_sec << std::endl;
return 0;
}
char *asctime(const struct tm *tm):
将struct tm转化为可读的字符串格式。例如
#include <iostream>
#include <ctime>
int main() {
time_t now = time(nullptr);
struct tm *local_time = localtime(&now);
std::cout << "可读时间: " << asctime(local_time);
return 0;
}
char *ctime(const time_t *timep):
将时间戳转化为可读的字符串格式。例如
#include <iostream>
#include <ctime>
int main() {
time_t now = time(nullptr);
std::cout << "可读时间: " << ctime(&now);
return 0;
}
(2)C++11(<chrono>)
C++11引入了<chrono>库,提供了更现代、更灵活的时间处理功能。
1.常用类型
std::chrono::system_clock:系统时钟,表示当前的日历时间。
std::chrono::steady_clock:稳定时钟,适用于测量时间间隔。
std::chrono::high_resolution_clock:高精度时钟(可能是system_clock)或(steady_clock的别名)。
2.常用函数
获取当前时间。使用system_clock::now()获取当前时间点。例如
#include <iostream>
#include <chrono>
int main() {
auto now = std::chrono::system_clock::now();
std::time_t now_time = std::chrono::system_clock::to_time_t(now);
std::cout << "当前时间: " << std::ctime(&now_time);
return 0;
}
时间间隔。使用 std::chrono::duration表示时间间隔。例如
#include <iostream>
#include <chrono>
#include <thread>
int main() {
auto start = std::chrono::steady_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(2)); // 休眠 2 秒
auto end = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
return 0;
}
时间点转换。使用 std::chrono::system_clock::to_time_t。将时间点转换为time_t。例如
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
auto now = std::chrono::system_clock::now();
std::time_t now_time = std::chrono::system_clock::to_time_t(now);
std::cout << "当前时间: " << std::ctime(&now_time);
return 0;
}
(3)C++20(<chrono>)扩展
C++20对<chrono>进行了扩展,引入了日历和时区支持。例如:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 获取当前时间点
auto now = system_clock::now();
// 转换为日历日期
auto today = floor<days>(now);
year_month_day ymd{today};
std::cout << "今天的日期: " << ymd.year() << "-"
<< static_cast<unsigned>(ymd.month()) << "-"
<< static_cast<unsigned>(ymd.day()) << std::endl;
return 0;
}
3.总结
-
C 标准库
<ctime>
: 适合简单的日期和时间操作。 -
C++11
<chrono>
: 提供了更现代、更灵活的时间处理功能,适合高精度计时和时间点操作。 -
C++20
<chrono>
: 扩展了日历和时区支持,适合复杂的日期和时间操作。
如有错误,敬请指正!!!