最終更新日時: 2024年12月10日 21時27分26秒 (JST)
Koichi Murase が更新

履歴 編集

function
<chrono>

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

    namespace std::chrono {
      const tzdb& reload_tzdb();
    }

## 概要

リモートタイムゾーンデータベースを再読込する。

この関数は、IANAのタイムゾーンデータベースをダウンロードし、`get_tzdb()`関数で取得できるローカルのタイムゾーンデータベースを、スレッドセーフに最新バージョンへと更新する。

IANAのタイムゾーンデータベースは、毎月もしくは季節ごとに更新される。長期間動かすプログラムの場合は、タイムゾーンデータベースが更新されることを想定する必要がある。`std::chrono::remote_version()`関数を呼び出すことでダウンロード先にあるタイムゾーンデータベースの最新バージョンがいくつなのかを取得できる。それとローカルのバージョンを比較してタイムゾーンデータベースを更新することになる。

    // 10日に一度などの周期で以下の処理を実行する
    if (get_tzdb().version != remote_version()) {
      reload_tzdb(); // get_tzdb()で取得されるタイムゾーンデータベースを更新する
    }

## 効果

- リモートタイムゾーンデータベースのバージョンを確認する。ローカルで保持しているタイムゾーンデータベースとバージョンが同じである場合、なにもしない
- そうでない場合、リモートタイムゾーンデータベースをダウンロードし、`get_tzdb_list()`関数で取得できるタイムゾーンデータベースリストの先頭要素の前に、リモートタイムゾーンデータベースを挿入する

## 戻り値

    return get_tzdb_list().front();

## 例外

なんからの理由で有効なタイムゾーンデータベースを参照できない場合、この関数は`runtime_error` 例外を送出する。

## 備考

- この関数による`get_tzdb_list().front()`と`get_tzdb_list().erase_after()`の呼び出しはスレッドセーフに行われる
- IANAのタイムゾーンデータベースは、以下からダウンロードできる：
  - Time Zone Database - IANA

## 例

    #include <iostream>
    #include <chrono>

    namespace chrono = std::chrono;

    int main()
    {
      // ローカルのタイムゾーンデータベースが古かったら更新する
      if (chrono::get_tzdb().version != chrono::remote_version()) {
        chrono::reload_tzdb();
      }
      std::cout << chrono::get_tzdb().version << std::endl;
    }

### 出力例

    2019c

## バージョン

### 言語

- C++20

### 処理系

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