Namespaces
Variants

std::chrono:: duration

From cppreference.net
ヘッダーで定義 <chrono>
template <

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

> class duration ;
(C++11以降)

クラステンプレート std::chrono::duration は時間間隔を表します。

これは Rep 型のティックカウントとティック周期で構成され、ティック周期はコンパイル時有理数 fraction であり、1ティックから次のティックまでの時間を秒単位で表します。

duration に格納される唯一のデータは、型 Rep のティックカウントです。 Rep が浮動小数点型の場合、 duration はティックの小数部分を表現できます。 Period はdurationの型の一部として含まれ、異なるduration間の変換時にのみ使用されます。

目次

メンバー型

メンバー型 定義
rep Rep 算術型、または算術型を模倣するクラスで、ティック数を表す
period Period (C++17まで) typename Period :: type (C++17以降) std::ratio ティック周期(1ティックあたりの秒の分数)を表す

メンバー関数

新しいdurationを構築する
(public member function)
内容を代入する
(public member function)
ティック数のカウントを返す
(public member function)
[static]
特別なduration値zeroを返す
(public static member function)
[static]
特別なduration値minを返す
(public static member function)
[static]
特別なduration値maxを返す
(public static member function)
単項+と単項-を実装する
(public member function)
ティック数をインクリメントまたはデクリメントする
(public member function)
2つのduration間の複合代入を実装する
(public member function)

非メンバー関数

期間を引数とする算術演算を実装する
(関数テンプレート)
(C++11) (C++11) (C++20で削除) (C++11) (C++11) (C++11) (C++11) (C++20)
2つの期間を比較する
(関数テンプレート)
期間を異なる刻み間隔の別の期間に変換する
(関数テンプレート)
期間を別の期間に変換し、切り下げを行う
(関数テンプレート)
期間を別の期間に変換し、切り上げを行う
(関数テンプレート)
期間を別の期間に変換し、最近接偶数への丸めを行う
(関数テンプレート)
期間の絶対値を取得する
(関数テンプレート)
(C++20)
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 >>

注意: 事前定義された期間型はそれぞれ、 hours まで、少なくとも±292年の範囲をカバーします。

各定義済み期間型 days weeks months および years は、少なくとも±40000年の範囲をカバーします。 years は365.2425 days (グレゴリオ暦の年の平均長)に等しい。 months は30.436875 days years の正確に1/12)に等しい。

(C++20以降)

ヘルパークラス

std::common_typeトレイトの特殊化
(クラステンプレートの特殊化)
期間が異なるティック周期を持つ期間に変換可能であることを示す
(クラステンプレート)
指定された型のティックカウントのゼロ、最小、最大値を構築する
(クラステンプレート)
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::print および std::println の効率的な実装を可能にします。

リテラル

インライン名前空間で定義 std::literals::chrono_literals
時間を表す std::chrono::duration リテラル
(関数)
分を表す std::chrono::duration リテラル
(関数)
秒を表す std::chrono::duration リテラル
(関数)
ミリ秒を表す std::chrono::duration リテラル
(関数)
マイクロ秒を表す std::chrono::duration リテラル
(関数)
ナノ秒を表す std::chrono::duration リテラル
(関数)

注: リテラルサフィックス d および y days years を指すのではなく、それぞれ day および year を参照します。

(C++20以降)

注記

期間オブジェクト d が保持する実際の時間間隔(秒単位)は、おおよそ d. count ( ) * D :: period :: num / D :: period :: den に等しくなります。ここで D chrono::duration<> 型であり、 d はその型のオブジェクトです。

機能テスト マクロ 標準 機能
__cpp_lib_chrono_udls 201304L (C++14) 時間型に対するユーザー定義リテラル

この例では、いくつかのカスタム期間型を定義し、型間で変換する方法を示します:

#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