C++中時間相關(guān)函數(shù)用法詳解
作者:YuLinMuRong
每種時鐘類型都有一些特性,如是否穩(wěn)定、是否單調(diào)遞增等??梢允褂?std::chrono::is_steady 和 std::chrono::is_clock 等類型特性查詢特定時鐘類型的屬性。
C++標準庫中的 <chrono> 頭文件提供了一套用于處理時間的工具,包括時鐘、時間點和持續(xù)時間等。下面是 <chrono> 庫的一些主要組件及其使用示例:
- 時鐘(Clocks):時鐘是一種用于度量時間的設(shè)備,C++標準庫提供了幾種不同的時鐘類型,包括系統(tǒng)時鐘、高精度時鐘和穩(wěn)定時鐘。示例:
#include <chrono>
#include <iostream>
int main() {
// 獲取當前系統(tǒng)時鐘時間點
auto now = std::chrono::system_clock::now();
// 將時間點轉(zhuǎn)換為時間戳
auto timestamp = std::chrono::system_clock::to_time_t(now);
// 打印時間戳
std::cout << "Timestamp: " << timestamp << std::endl;
return 0;
}
- 時間點(Time points):時間點是時鐘的特定實例化,代表特定時鐘上的一個瞬時點。示例:
#include <chrono>
#include <iostream>
int main() {
// 使用系統(tǒng)時鐘獲取當前時間點
auto now = std::chrono::system_clock::now();
// 使用 steady_clock 獲取時間點
auto start = std::chrono::steady_clock::now();
// 一些操作...
// 使用 steady_clock 獲取結(jié)束時間點
auto end = std::chrono::steady_clock::now();
// 計算持續(xù)時間
auto duration = end - start;
// 打印持續(xù)時間
std::cout << "Duration: " << std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() << " milliseconds" << std::endl;
return 0;
}
- 持續(xù)時間(Durations):持續(xù)時間表示兩個時間點之間的時間段。示例:
#include <chrono>
#include <iostream>
int main() {
// 創(chuàng)建一個持續(xù)時間為1秒的時間段
auto duration = std::chrono::seconds(1);
// 打印持續(xù)時間的秒數(shù)
std::cout << "Duration in seconds: " << duration.count() << std::endl;
return 0;
}
- 時鐘精度(Clock precision):每種時鐘可能具有不同的精度,可以使用std::chrono::high_resolution_clock來獲取高精度時鐘。示例:
#include <chrono>
#include <iostream>
int main() {
// 獲取高精度時鐘的當前時間點
auto high_res_now = std::chrono::high_resolution_clock::now();
// 打印高精度時鐘的當前時間點
std::cout << "High resolution clock time: " << high_res_now.time_since_epoch().count() << std::endl;
return 0;
}
- 時間單位轉(zhuǎn)換(Time unit conversion):可以使用std::chrono::duration_cast函數(shù)將持續(xù)時間從一個時間單位轉(zhuǎn)換為另一個時間單位。示例:
#include <chrono>
#include <iostream>
int main() {
// 創(chuàng)建一個持續(xù)時間為1小時的時間段
auto duration_hours = std::chrono::hours(1);
// 將持續(xù)時間從小時轉(zhuǎn)換為分鐘
auto duration_minutes = std::chrono::duration_cast<std::chrono::minutes>(duration_hours);
// 打印轉(zhuǎn)換后的持續(xù)時間
std::cout << "Duration in minutes: " << duration_minutes.count() << std::endl;
return 0;
}
- 日期和時間格式化(Date and time formatting):C++ 標準庫不提供直接的日期和時間格式化功能,但可以與其他庫(如strftime)結(jié)合使用來實現(xiàn)格式化。示例:
#include <chrono>
#include <iostream>
#include <ctime>
int main() {
// 獲取當前系統(tǒng)時鐘時間點
auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
// 使用 strftime 將時間點格式化為字符串
std::string time_str(30, '\0');
std::strftime(&time_str[0], time_str.size(), "%Y-%m-%d %H:%M:%S", std::localtime(&now));
// 打印格式化后的時間字符串
std::cout << "Formatted time: " << time_str << std::endl;
return 0;
}
- 時鐘類型的特性(Clock traits):每種時鐘類型都有一些特性,如是否穩(wěn)定、是否單調(diào)遞增等。可以使用std::chrono::is_steady和std::chrono::is_clock等類型特性查詢特定時鐘類型的屬性。示例:
#include <chrono>
#include <iostream>
int main() {
// 查詢系統(tǒng)時鐘是否穩(wěn)定
std::cout << "System clock is steady: " << std::chrono::is_steady<std::chrono::system_clock>::value << std::endl;
// 查詢高精度時鐘是否為時鐘類型
std::cout << "High resolution clock is a clock type: " << std::chrono::is_clock<std::chrono::high_resolution_clock>::value << std::endl;
return 0;
}
- 時鐘轉(zhuǎn)換(Clock conversion):可以使用std::chrono::time_point_cast函數(shù)將時間點從一個時鐘類型轉(zhuǎn)換為另一個時鐘類型。示例:
#include <chrono>
#include <iostream>
int main() {
// 獲取系統(tǒng)時鐘的當前時間點
auto sys_now = std::chrono::system_clock::now();
// 將系統(tǒng)時鐘的時間點轉(zhuǎn)換為高精度時鐘的時間點
auto high_res_now = std::chrono::time_point_cast<std::chrono::high_resolution_clock::duration>(sys_now);
// 打印高精度時鐘的時間點
std::cout << "High resolution clock time: " << high_res_now.time_since_epoch().count() << std::endl;
return 0;
}
- 自定義時鐘(Custom clocks):可以根據(jù)需要自定義時鐘類型,并提供時鐘類型的必要特性和實現(xiàn)。示例:
#include <chrono>
#include <iostream>
// 自定義時鐘類型
struct MyClock {
using duration = std::chrono::nanoseconds; // 持續(xù)時間類型
using rep = duration::rep; // 表示時間的基本類型
using period = duration::period; // 時間單位
using time_point = std::chrono::time_point<MyClock>; // 時間點類型
static constexpr bool is_steady = false; // 是否穩(wěn)定
static time_point now() noexcept { return time_point(std::chrono::duration_cast<duration>(std::chrono::steady_clock::now().time_since_epoch())); }
};
int main() {
// 獲取自定義時鐘的當前時間點
auto my_clock_now = MyClock::now();
// 打印自定義時鐘的時間點
std::cout << "Custom clock time: " << my_clock_now.time_since_epoch().count() << std::endl;
return 0;
}
責任編輯:武曉燕
來源:
Linux兵工廠