名前空間
変種
操作

std::chrono::duration

From cppreference.com
< cpp‎ | chrono
 
 
 
 
ヘッダー <chrono> で定義
template<

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

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

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

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

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

目次

[編集] メンバー型

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

[編集] メンバー関数

新しいdurationを構築する
(publicメンバー関数) [編集]
内容を代入する
(publicメンバー関数) [編集]
ティック数を返す
(publicメンバー関数) [編集]
[static]
特別なduration値ゼロを返す
(public staticメンバー関数) [編集]
[static]
特別なduration値minを返す
(public staticメンバー関数) [編集]
[static]
特別なduration値maxを返す
(public staticメンバー関数) [編集]
単項+および単項-を実装
(publicメンバー関数) [編集]
ティック数を増減する
(publicメンバー関数) [編集]
2つのduration間の複合代入を実装する
(publicメンバー関数) [編集]

[編集] 非メンバー関数

期間を引数とする算術演算を実装
(関数テンプレート) [編集]
(C++11)(C++11)(C++20で削除)(C++11)(C++11)(C++11)(C++11)(C++20)
2つの期間を比較する
(関数テンプレート) [edit]
期間を異なる刻み間隔を持つ別の期間に変換する
(関数テンプレート) [edit]
期間を別の期間に変換し、切り捨てる
(関数テンプレート) [edit]
期間を別の期間に変換し、切り上げる
(関数テンプレート) [edit]
期間を別の期間に変換し、最も近い値に丸め、等距離の場合は偶数に丸める
(関数テンプレート) [edit]
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>>

注: 定義済みのhoursまでの各期間型は、少なくとも±292年の範囲をカバーします。

定義済みのduration型daysweeksmonthsyearsは、それぞれ少なくとも±40000年の範囲をカバーします。yearsは365.2425 daysに相当し(グレゴリオ暦の平均的な年長)、monthsは30.436875 daysに相当します(正確にyearsの1/12)。

(C++20以降)

[編集] ヘルパークラス

std::common_type 特性を特殊化する
(クラス テンプレートの特殊化) [edit]
期間が異なるティック周期の期間に変換可能であることを示す
(クラステンプレート) [編集]
指定された型のティックカウントのゼロ、最小値、最大値を構築する
(クラステンプレート) [編集]
duration の書式設定サポート
(クラス テンプレートの特殊化) [edit]
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以降)

[編集] 注釈

durationオブジェクトdが保持する実際の時間間隔(秒単位)は、およそd.count() * D::period::num / D::period::denに等しく、ここでDchrono::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
English 日本語 中文(简体) 中文(繁體)