最終更新日時: 2025年07月13日 13時07分37秒 (JST)
Koichi Murase が更新

履歴 編集

class template
<chrono>

# std::chrono::duration(C++11)

    namespace std {
    namespace chrono {
      template <class Rep, class Period = ratio<1>>
      class duration;
    }}

## 概要

`duration`は、2つの時間の間隔を表現するための型である。

`duration`のテンプレートパラメータである`ratio`の値によって、時間のためのあらゆる単位(ナノ秒、ミリ秒、秒, etc...)を表現することができる。

標準では、以下の別名が提供される：

型の別名 | 説明 | 対応バージョン
--- | --- | ---
`nanoseconds` | ナノ秒 | C++11
`microseconds` | マイクロ秒 | C++11
`milliseconds` | ミリ秒 | C++11
`seconds` | 秒 | C++11
`minutes` | 分 | C++11
`hours` | 時 | C++11
`days` | 日 | C++20
`weeks` | 週 | C++20
`years` | 年 | C++20
`months` | 月 | C++20

## メンバ関数

### 構築／コピー／破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++11
`~duration() = default;` | デストラクタ | C++11
`operator=(const duration&) = default;` | 代入演算子 | C++11

### 観測

名前 | 説明 | 対応バージョン
--- | --- | ---
`count` | 値を取得する | C++11

### 算術演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator+` | 正の符号 | C++11
`operator-` | 負の符号 (符号反転する) | C++11
`operator++` | 値をインクリメントする | C++11
`operator--` | 値をデクリメントする | C++11
`operator+=` | `+`の複合代入 | C++11
`operator-=` | `-`の複合代入 | C++11
`operator*=` | `*`の複合代入 | C++11
`operator/=` | `/`の複合代入 | C++11
`operator%=` | `%`の複合代入 | C++11

## 静的メンバ関数

### 特別な値

名前 | 説明 | 対応バージョン
--- | --- | ---
`zero` | 初期値を取得 | C++11
`min` | 最小値を取得 | C++11
`max` | 最大値を取得 | C++11

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`rep` | 値の数値型 `Rep` | C++11
`period` | 値の周期を表す型 `Period` | C++11

## 非メンバ関数

### 丸め演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`duration_cast` | ゼロ方向への丸め | C++11
`floor` | 負の無限大方向への丸め | C++17
`ceil` | 正の無限大方向への丸め | C++17
`round` | 偶数方向への丸め | C++17

### その他数学関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`abs` | 絶対値を求める | C++17

### 算術演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator+` | 加算 | C++11
`operator-` | 減算 | C++11
`operator*` | 乗算 | C++11
`operator/` | 除算 | C++11
`operator%` | 剰余算 | C++11

### 比較演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較を行う | C++11
`operator!=` | 非等値比較を行う | C++11
`operator<=>` | 三方比較を行う | C++20
`operator<` | 左辺が右辺より小さいか比較を行う | C++11
`operator<=` | 左辺が右辺以下かの比較を行う | C++11
`operator>` | 左辺が右辺より大きいか比較を行う | C++11
`operator>=` | 左辺が右辺以上かの比較を行う | C++11

### 入出力

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator<<` | ストリームへの出力 | C++20
`from_stream` | フォーマットを指定してストリームから入力 | C++20

### リテラル

名前 | 説明 | 対応バージョン
--- | --- | ---
`ns` | ナノ秒リテラル | C++14
`us` | マイクロ秒リテラル | C++14
`ms` | ミリ秒リテラル | C++14
`s` | 秒リテラル | C++14
`min` | 分リテラル | C++14
`h` | 時リテラル | C++14

## 共通型サポート

名前 | 説明 | 対応バージョン
--- | --- | ---
`common_type` | 異なる`duration`間の共通の型を求める`std::common_type`の特殊化 | C++11

## 文字列フォーマットサポート

名前 | 説明 | 対応バージョン
--- | --- | ---
`formatter` | 文字列フォーマットの許可。`std::formatter`クラスの特殊化 | C++20
`enable_nonlocking_formatter_optimization` | `std::print()`と`std::println()`の効率的な実装を有効にする | C++26

## ハッシュサポート

名前 | 説明 | 対応バージョン
--- | --- | ---
`template <class T> struct hash;` | `hash`クラスの先行宣言 | C++26
`template<class Rep, class Period>` `struct hash<chrono::duration<Rep, Period>>;` | `hash`クラスの`duration`に対する特殊化。`hash<Rep>`が有効な場合のみ有効 | C++26

## 例

    #include <iostream>
    #include <chrono>
    #include <ctime>

    using std::chrono::system_clock;
    using std::chrono::seconds;

    void print(const system_clock::time_point& p)
    {
      std::time_t t = system_clock::to_time_t(p);
      char buf[26];  // 最低26バイトが必要
    #ifdef _MSC_VER
      // Visual Studioではctime_s()が推奨されている。
      ctime_s(buf, 26, &t);
    #else
      // ctime()のリエントラント版
      ctime_r(&t, buf);
    #endif
      // 出力された文字列には改行が含まれていることに注意
      std::cout << buf;
    }

    int main()
    {
      // 現在日時を取得
      system_clock::time_point now = system_clock::now();

      // 3秒後の日時を取得
      system_clock::time_point p = now + seconds(3);

      print(now);
      print(p);
    }

### 出力例

    Tue Oct 16 16:25:08 2012
    Tue Oct 16 16:25:11 2012

## バージョン

### 言語

- C++11

### 処理系

- GCC: 4.7.0 ✅
- Visual C++: 2012 ✅, 2013 ✅, 2015 ✅
- Clang: 14.0.6 ✅

## 参照

- P2592R3 Hashing support for `std::chrono` value classes
  - C++26でハッシュサポートが追加された