最終更新日時: 2025年09月27日 16時21分06秒 (JST)
Raclamusi が更新

履歴 編集

class
<chrono>

# std::formatter(C++20)

    namespace std {
      template <class Duration, class charT>
      struct formatter<chrono::local-time-format-t<Duration>, charT>;
    }

## 概要

`local-time-format-t`クラスに対する`std::formatter`クラステンプレートの特殊化。

`formatter::format()`関数に渡される`local-time-format-t<Duration>`型の変数`f`があるとして、

- `%Z` (タイムゾーンの略称) が指定された場合、`f.abbrev`がヌルポインタでなければ`*f.abbrev`で置き換えられる。`%Z`が指定されて`f.abbrev`がヌルポインタだった場合、`std::format_error` 例外が送出される
- `%z`もしくはその改良コマンドが指定された場合、`f.offset_sec`がヌルポインタでなければ`*f.offset_sec`がフォーマットされる。`%z`もしくはその改良コマンドが指定されて`f.offset_sec`がヌルポインタだった場合、`std::format_error` 例外が送出される

## 例

    #include <iostream>
    #include <chrono>
    #include <format>

    namespace chrono = std::chrono;

    int main()
    {
      auto now = chrono::system_clock::now();
      chrono::sys_seconds now_sec = chrono::floor<chrono::seconds>(now); // 秒単位

      chrono::zoned_time zt{"Asia/Tokyo", now_sec};
      std::cout << std::format("{:%Y/%m/%d %H:%M:%S %Z}", zt) << std::endl;

      auto lt = zt.get_local_time();
      chrono::sys_info si = zt.get_info();
      {
        auto ltf = chrono::local_time_format(lt, &si.abbrev);
        std::cout << std::format("{:%Y/%m/%d %H:%M:%S %Z}", ltf) << std::endl;
      }
      {
        auto ltf = chrono::local_time_format(lt, &si.abbrev, &si.offset);
        std::cout << std::format("{:%Y/%m/%d %H:%M:%S %Z%z}", ltf) << std::endl;
      }
    }

### 出力例

    2019/12/20 19:05:05 JST
    2019/12/20 19:05:05 JST
    2019/12/20 19:05:05 JST+0900

## バージョン

### 言語

- C++20

### 処理系

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