📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の5版が非表示) | |||
| 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> | ||