最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

class
<chrono>

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

    namespace std::chrono {
      class nonexistent_local_time : public runtime_error;
    }

## 概要

`nonexistent_local_time`は、ローカル時間からシステム時間 (UTCタイムゾーン) への変換において、`choose`型の丸め方法を指定することなく、存在しないローカル時間を指定した場合に発生する例外の型である。

存在しないローカル時間は、サマータイムを採用しているタイムゾーンにおいて起こり得る。例として、タイムゾーン`"America/New_York"`のローカル時刻 2016-03-13 02:30:00 は以下の隙間に位置するため存在しえない：

- 2016-03-13 02:00:00 EST
- 2016-03-13 03:00:00 EDT
- 2016-03-13 07:00:00 UTC

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`template<class Duration>` `nonexistent_local_time(const local_time<Duration>& tp, const local_info& i);` | デフォルトコンストラクタ | C++20
`virtual const char* what() const noexcept;` | エラー理由となる文字列 | C++20

`what()`メンバ関数は、以下と等価な文字列を返す：

    ostringstream os;
    os << tp << " is in a gap between\n"
       << local_seconds{i.first.end.time_since_epoch()} + i.first.offset << ' '
       << i.first.abbrev << " and\n"
       << local_seconds{i.second.begin.time_since_epoch()} + i.second.offset << ' '
       << i.second.abbrev
       << " which are both equivalent to\n"
       << i.first.end << " UTC";

    return os.str().c_str();

## 例

    #include <iostream>
    #include <chrono>

    namespace chrono = std::chrono;
    using namespace std::chrono_literals;

    int main()
    {
      chrono::local_time lt = chrono::local_days{2016y/3/13} + 2h + 30min;

      try {
        // America/New_Yorkタイムゾーンのローカル時間を、
        // UTCタイムゾーンのシステム時間に変換して保持
        chrono::zoned_time zt{"America/New_York", lt};
      }
      catch (const chrono::nonexistent_local_time& e) {
        std::cout << e.what() << std::endl;
      }
    }

### 出力

    2016-03-13 02:30:00 is in a gap between
    2016-03-13 02:00:00 EST and
    2016-03-13 03:00:00 EDT which are both equivalent to
    2016-03-13 07:00:00 UTC

### 処理系

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