📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の6版が非表示)
304行目: 304行目:
<u>※注意</u><br>
<u>※注意</u><br>
<u>一部の機能 (特にタイムゾーン関連) は、使用する実装によっては、まだ完全にはサポートされていない可能性がある。</u><br>
<u>一部の機能 (特にタイムゾーン関連) は、使用する実装によっては、まだ完全にはサポートされていない可能性がある。</u><br>
<br>
==== Howard Hinnant's dateライブラリ ====
===== Howard Hinnant's dateライブラリとは =====
Howard Hinnant's dateライブラリは強力で柔軟性が高いため、C++20の標準ライブラリと同様の機能を提供している。<br>
また、C++20の標準ライブラリと非常に互換性が高く、追加の機能も使用できる。<br>
<br>
特に、C++20のサポートがまだ完全でない環境やより高度なタイムゾーン機能が必要な場合に適している。<br>
<br>
Howard Hinnant's dateライブラリのメリットを以下に示す。<br>
* C++20の標準ライブラリとよく似たインターフェースを提供しているため、将来的にC++20への移行時の変更が最小限で済む。
* 広範なプラットフォームとコンパイラでサポートされている。
* タイムゾーンデータベースの更新が容易である。
* 追加の機能 (例: タイムゾーン間の変換) が利用可能である。
<br>
なお、Howard Hinnant's dateライブラリのライセンスは、MITライセンスに準拠している。<br>
<br>
===== Howard Hinnant's dateライブラリのインストール =====
Howard Hinnant's dateライブラリのビルドに必要なライブラリをインストールする。<br>
# RHEL
sudo dnf install libcurl-devel
# SUSE
sudo zypper install libcurl-devel
<br>
[https://github.com/HowardHinnant/date Howard Hinnant's dateライブラリのGithub]にアクセスして、ソースコードをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
tar xf date-<バージョン>.tar.gz
cd date-<バージョン>
<br>
または、<code>git clone</code>コマンドを実行して、ソースコードをダウンロードすることもできる。<br>
git clone https://github.com/HowardHinnant/date.git
cd date
<br>
Howard Hinnant's dateライブラリをビルドおよびインストールする。<br>
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=<Howard Hinnant's dateライブラリのインストールディレクトリ> \
      -DBUILD_SHARED_LIBS=ON    \
      -DBUILD_TZ_LIB=ON          \  # タイムゾーンライブラリをビルドする場合 (推奨)
      -DMANUAL_TZ_DB=ON          \  # 開発者がソースコード内で set_install を呼び出して手動で TZ DB を設定する場合
      -DENABLE_DATE_TESTING=ON  \  # ユニットテストを有効にする場合
      ..
make -j $(nproc)
make install
<br>
===== サンプルコード =====
以下の例では、Howard Hinnant's dateライブラリを使用して、UTC時間、日本時間、フランス時間の3つのタイムゾーンで現在時刻と本日の経過時間を表示している。<br>
<br>
<syntaxhighlight lang="c++">
#include <iostream>
#include <iomanip>
#include "date/date.h"
#include "date/tz.h"
using namespace date;
using namespace std::chrono;
template<typename Clock, typename Duration>
void print_time_info(const std::string &zone_name, const zoned_time<Duration> &zt)
{
    auto now = zt.get_local_time();
    auto today = floor<days>(now);
    auto time_since_midnight = now - today;
    auto ymd = year_month_day{today};
    auto time = make_time(floor<milliseconds>(time_since_midnight));
    std::cout << zone_name << ": \n";
    std::cout << "  現在時刻: " << ymd << ' ' << time << '\n';
    std::cout << "  経過時間: " << duration_cast<milliseconds>(time_since_midnight).count() << " ms\n\n";
}
int main()
{
    try {
      // 現在のシステム時間を取得
      auto now = system_clock::now();
      // 各タイムゾーンでの時間を計算
      auto utc_time = zoned_time{"UTC", now};
      auto tokyo_time = zoned_time{"Asia/Tokyo", now};
      auto paris_time = zoned_time{"Europe/Paris", now};
      // 各タイムゾーンの情報を表示
      print_time_info("UTC", utc_time);
      print_time_info("日本時間", tokyo_time);
      print_time_info("フランス時間", paris_time);
      // 日付操作の例
      auto today = floor<days>(utc_time.get_local_time());
      auto this_year = year_month_day{today}.year();
      auto new_years_day = sys_days{this_year/January/1};
      auto days_since_new_year = floor<days>(utc_time.get_sys_time() - new_years_day);
      std::cout << "今年の元旦から今日までの日数: " << days_since_new_year.count() << " 日\n";
      // タイムゾーン間の変換例
      auto tokyo_local = tokyo_time.get_local_time();
      auto paris_local = zoned_time{"Europe/Paris", tokyo_local};
      std::cout << "\n東京時間 " << tokyo_local << std::endl;
      std::cout << "パリ時間 " << paris_local.get_local_time() << std::endl;
    }
    catch (const std::exception &e) {
      std::cerr << "エラー: " << e.what() << std::endl;
      return -1;
    }
    return 0;
}
</syntaxhighlight>
<br>
# 出力例
UTC:
  現在時刻: 2024-09-05 05:30:45.123
  経過時間: 19845123 ms
日本時間:
  現在時刻: 2024-09-05 14:30:45.123
  経過時間: 52245123 ms
フランス時間:
  現在時刻: 2024-09-05 07:30:45.123
  経過時間: 27045123 ms
今年の元旦から今日までの日数: 249 日
東京時間 2024-09-05 14:30:45.123 は、
パリ時間 2024-09-05 07:30:45.123 です。
<br><br>
<br><br>


== C++ 標準タイムゾーンライブラリとHoward Hinnant's dateライブラリ ==
== 比較 : C++標準タイムゾーンライブラリとHoward Hinnant's dateライブラリ ==
C++20の標準タイムゾーンライブラリとHoward Hinnant's dateライブラリでは、互いに長所・短所があり、プロジェクトの要件により適切な選択が異なる場合がある。<br>
C++20の標準タイムゾーンライブラリとHoward Hinnant's dateライブラリでは、互いに長所・短所があり、プロジェクトの要件により適切な選択が異なる場合がある。<br>
<br>
<br>