最終更新日時(UTC): 2025年10月19日 16時07分56秒
Raclamusi が更新

履歴 編集

function
<chrono>

# std::chrono::from_stream(C++20)

    namespace std::chrono {
      template <class charT, class traits,
                class Rep, class Period, class Alloc = std::allocator<charT>>
      basic_istream<charT, traits>&
        from_stream(std::basic_istream<charT, traits>& is,
                    const charT* fmt,
                    duration<Rep, Period>& d,
                    std::basic_string<charT, traits, Alloc>* abbrev = nullptr,
                    minutes* offset = nullptr);  // (1) C++20
    }

## 概要

フォーマット指定して入力ストリームから`duration`オブジェクトに入力する。

## 効果

- パラメータ`fmt`で指定されたフォーマットフラグを使用して、入力を解析し、`d`に代入する
- 有効な日付・時間の解析に失敗した場合、`is.setstate(ios_base::failbit)`が呼び出され、パラメータ`d`は変更されない
- タイムゾーンフォーマット`"%Z"`が指定され、解析が成功した場合、パラメータ`abbrev`が非ヌルである場合に`*abbrev`にタイムゾーン名が代入される
- タイムゾーンとしてUTC時間からのオフセット時間 (日本なら`"+0900"`) を意味するフォーマット`"%z"`が指定され、解析が成功した場合、パラメータ`offset`が非ヌルである場合に`*offset`にその値が代入される

## 戻り値

    return is;

## 例

    #include <iostream>
    #include <chrono>
    #include <sstream>

    namespace chrono = std::chrono;

    int main()
    {
      {
        std::stringstream ss;
        ss << "3";

        chrono::seconds sec{0};
        chrono::from_stream(ss, "%S", sec);

        std::cout << sec << std::endl;
      }
      {
        std::stringstream ss;
        ss << "0+0900 JST";

        chrono::seconds sec{3};
        std::string abbrev;
        chrono::minutes offset{0};
        chrono::from_stream(ss, "%S%z %Z", sec, &abbrev, &offset);

        std::cout << sec << std::endl;
        std::cout << abbrev << std::endl;
        std::cout << chrono::floor<chrono::hours>(offset) << std::endl;
      }
    }

### 出力

    3s
    0s
    JST
    9h

## バージョン

### 言語

- C++20

### 処理系

- Clang: 9.0 ❌
- GCC: 9.2 ❌, 15.1 ✅
- Visual C++: 2019 Update 3 ❌

## 関連項目

- chronoの`parse()` (入力フォーマットの詳細)