名稱空間
變體
操作

std::chrono::duration

來自 cppreference.com
< cpp‎ | chrono
 
 
 
 
定義於標頭檔案 <chrono>
template<

    class Rep,
    class Period = std::ratio<1>

> class duration;
(C++11 起)

類模板 std::chrono::duration 表示一個時間間隔。

它由型別為 Rep 的刻度計數和一個刻度週期組成,其中刻度週期是一個編譯時有理分數,表示從一個刻度到下一個刻度的時間(以秒為單位)。

儲存在 duration 中的唯一資料是型別為 Rep 的刻度計數。如果 Rep 是浮點型別,則 duration 可以表示刻度的分數。Period 作為 duration 型別的一部分包含在內,僅在不同 duration 之間進行轉換時使用。

目錄

[編輯] 成員型別

成員型別 定義
rep Rep,一個算術型別,或一個模擬算術型別的類,表示刻度數
period Period(C++17 前)typename Period::type(C++17 起),一個 std::ratio 表示刻度週期(即每刻度的秒分數)

[編輯] 成員函式

構造新的 duration
(public 成員函式) [編輯]
賦值內容
(public 成員函式) [編輯]
返回刻度計數
(public 成員函式) [編輯]
[靜態]
返回特殊的 duration 值 zero
(public static 成員函式) [編輯]
[靜態]
返回特殊的 duration 值 min
(public static 成員函式) [編輯]
[靜態]
返回特殊的 duration 值 max
(public static 成員函式) [編輯]
實現一元 + 和一元 -
(public 成員函式) [編輯]
增加或減少刻度計數
(public 成員函式) [編輯]
實現兩個 duration 之間的複合賦值
(public 成員函式) [編輯]

[編輯] 非成員函式

實現以持續時間為引數的算術運算
(函式模板) [編輯]
(C++11)(C++11)(在 C++20 中移除)(C++11)(C++11)(C++11)(C++11)(C++20)
比較兩個 durations
(函式模板) [編輯]
將一個 duration 轉換為另一個,具有不同的時鐘間隔
(函式模板) [編輯]
將一個 duration 轉換為另一個,向下取整
(函式模板) [編輯]
將一個 duration 轉換為另一個,向上取整
(函式模板) [編輯]
將一個 duration 轉換為另一個,四捨五入到最接近的值,平局時取偶數
(函式模板) [編輯]
獲取 duration 的絕對值
(函式模板) [編輯]
duration 執行流輸出
(函式模板) [編輯]
根據提供的格式從流中解析 duration
(函式模板) [編輯]

[編輯] 輔助型別

下表中的型別 /* intXX */ 表示至少 XX 位的有符號整數型別。

型別 定義
std::chrono::nanoseconds std::chrono::duration</* int64 */, std::nano>
std::chrono::microseconds std::chrono::duration</* int55 */, std::micro>
std::chrono::milliseconds std::chrono::duration</* int45 */, std::milli>
std::chrono::seconds std::chrono::duration</* int35 */>
std::chrono::minutes std::chrono::duration</* int29 */, std::ratio<60>>
std::chrono::hours std::chrono::duration</* int23 */, std::ratio<3600>>
std::chrono::days (C++20 起) std::chrono::duration</* int25 */, std::ratio<86400>>
std::chrono::weeks (C++20 起) std::chrono::duration</* int22 */, std::ratio<604800>>
std::chrono::months (C++20 起) std::chrono::duration</* int20 */, std::ratio<2629746>>
std::chrono::years (C++20 起) std::chrono::duration</* int17 */, std::ratio<31556952>>

注意:每個預定義的 duration 型別,直到 hours,至少覆蓋 ±292 年的範圍。

預定義的 duration 型別 daysweeksmonthsyears,每個都至少覆蓋 ±40000 年的範圍。years 等於 365.2425 days(公曆年的平均長度)。months 等於 30.436875 days(恰好是 years 的 1/12)。

(C++20 起)

[編輯] 輔助類

特化 std::common_type 特性
(類模板特化) [編輯]
指示 duration 可以轉換為具有不同刻度週期的 duration
(類模板) [編輯]
構造給定型別刻度計數的零、最小值和最大值
(類模板) [編輯]
duration 的格式化支援
(類模板特化) [編輯]
支援 std::chrono::duration 的雜湊
(類模板特化)

[編輯] 輔助特化

template< class Rep, class Period >

constexpr bool enable_nonlocking_formatter_optimization<chrono::duration<Rep, Period>>

    = enable_nonlocking_formatter_optimization<Rep>;
(C++23 起)

std::enable_nonlocking_formatter_optimization 的特化允許在模板引數 Rep 啟用時,為列印 chrono::duration 物件高效實現 std::printstd::println

[編輯] 字面量

在內聯名稱空間 std::literals::chrono_literals 中定義
表示小時的 std::chrono::duration 字面量
(函式) [編輯]
表示分鐘的 std::chrono::duration 字面量
(函式) [編輯]
表示秒的 std::chrono::duration 字面量
(函式) [編輯]
表示毫秒的 std::chrono::duration 字面量
(函式) [編輯]
表示微秒的 std::chrono::duration 字面量
(函式) [編輯]
表示納秒的 std::chrono::duration 字面量
(函式) [編輯]

注意:字面量字尾 dy 不指 daysyears,而是指 dayyear

(C++20 起)

[編輯] 註釋

由 duration 物件 d 持有的實際時間間隔(以秒為單位)大致等於 d.count() * D::period::num / D::period::den,其中 D 是型別 chrono::duration<>,而 d 是此類型別的一個物件。

特性測試 標準 特性
__cpp_lib_chrono_udls 201304L (C++14) 時間型別的使用者定義字面量

[編輯] 示例

此示例展示瞭如何定義幾個自定義 duration 型別並在型別之間進行轉換

#include <chrono>
#include <iostream>
 
using namespace std::chrono_literals;
 
template<typename T1, typename T2>
using mul = std::ratio_multiply<T1, T2>;
 
int main()
{
    using microfortnights = std::chrono::duration<float,
        mul<mul<std::ratio<2>, std::chrono::weeks::period>, std::micro>>;
    using nanocenturies = std::chrono::duration<float,
        mul<mul<std::hecto, std::chrono::years::period>, std::nano>>;
    using fps_24 = std::chrono::duration<double, std::ratio<1, 24>>;
 
    std::cout << "1 second is:\n";
 
    // integer scale conversion with no precision loss: no cast
    std::cout << std::chrono::milliseconds(1s).count() << " milliseconds\n"
              << std::chrono::microseconds(1s).count() << " microseconds\n"
              << std::chrono::nanoseconds(1s).count() << " nanoseconds\n";
 
    // integer scale conversion with precision loss: requires a cast
    std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
              << " minutes\n";
    // alternative to duration_cast:
    std::cout << 1s / 1min << " minutes\n";
 
    // floating-point scale conversion: no cast
    std::cout << microfortnights(1s).count() << " microfortnights\n"
              << nanocenturies(1s).count() << " nanocenturies\n"
              << fps_24(1s).count() << " frames at 24fps\n";
}

輸出

1 second is:
1000 milliseconds
1000000 microseconds
1000000000 nanoseconds
0 minutes
0 minutes
0.82672 microfortnights
0.316887 nanocenturies
24 frames at 24fps