ホームページ  >  記事  >  バックエンド開発  >  `std::chrono::time_point` オブジェクトから時間コンポーネントを抽出するにはどうすればよいですか?

`std::chrono::time_point` オブジェクトから時間コンポーネントを抽出するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-02 18:58:31431ブラウズ

How can I extract temporal components from a `std::chrono::time_point` object?

std::chrono::time_point から時間コンポーネントを抽出する

目的: 年、月、日、時、分、秒を取得する

解決策:

この情報を抽出するには、特に system_ Clock::time_point が必要です。

<code class="cpp">using namespace std::chrono;
system_clock::time_point now = system_clock::now();</code>

次のステップでは、以下を使用して time_t に変換します。

<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>

C ライブラリを利用して time_t を tm に変換し、正しい時刻を保証します。ゾーンが選択されています:

<code class="cpp">tm utc_tm = *gmtime(&amp;tt);
tm local_tm = *localtime(&amp;tt);</code>

これで、tm のコンポーネントを抽出できます:

<code class="cpp">std::cout << local_tm.tm_year + 1900 << '\n';
std::cout << local_tm.tm_mon + 1 << '\n';
std::cout << local_tm.tm_mday << '\n';

システム クロック コンポーネントの抽出

さらに、必要に応じて、次の非保証アプローチに依存できます:

ほとんどの人に知られている system_ Clock の実装はすべて Unix 時間 (UTC 1970 年 1 月 1 日からの秒数) に基づいており、通常は秒よりも細かい精度です。

次の包括的なプログラムは、すべての時間コンポーネントを抽出する例を示しています:

<code class="cpp">#include <chrono>
#include <ctime>
#include <iostream>

int main() {
  using namespace std::chrono;
  typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;
  system_clock::time_point now = system_clock::now();
  system_clock::duration tp = now.time_since_epoch();
  days d = duration_cast<days>(tp);
  tp -= d;
  hours h = duration_cast<hours>(tp);
  tp -= h;
  minutes m = duration_cast<minutes>(tp);
  tp -= m;
  seconds s = duration_cast<seconds>(tp);
  tp -= s;
  std::cout << d.count() << "d " << h.count() << ':' << m.count() << ':' << s.count();
  std::cout << " " << tp.count() << "[" << system_clock::duration::period::num << '/' << system_clock::duration::period::den << "]\n";

  time_t tt = system_clock::to_time_t(now);
  tm utc_tm = *gmtime(&amp;tt);
  tm local_tm = *localtime(&amp;tt);
  std::cout << utc_tm.tm_year + 1900 <&lt '-';
  std::cout << utc_tm.tm_mon + 1 << '-';
  std::cout << utc_tm.tm_mday << ' ';
  std::cout << utc_tm.tm_hour << ':';
  std::cout << utc_tm.tm_min << ':';
  std::cout << utc_tm.tm_sec << '\n';
}</code>

カスタム期間の使用

日をモデル化するには、カスタム期間を作成します:

<code class="cpp">typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;</code>

これで、system_ Clock::duration の精度を使用してエポック以降の時間を取得できます:

<code class="cpp">system_clock::duration tp = now.time_since_epoch();</code>

日数に切り捨てて減算します:

<code class="cpp">days d = duration_cast<days>(tp);
tp -= d;</code>

これを繰り返します時、分、秒を処理します。

残りは、system_ Clock::duration の単位での秒の小数部分です。

日付ライブラリの使用

この C 11/14 ライブラリは、上記のプロセスを合理化します。

<code class="cpp">#include "date.h"
#include <iostream>

int main() {
  using C = std::chrono;
  using D = date;
  using S = std;

  auto tp = C::system_clock::now();
  {
    using namespace date;
    S::cout << tp << '\n';
  }
  auto dp = D::floor<D::days>(tp);
  auto ymd = D::year_month_day{dp};
  auto time = D::make_time(C::duration_cast<C::milliseconds>(tp - dp));
  S::cout << "year        = " << ymd.year() << '\n';
  S::cout << "month       = " << ymd.month() << '\n';
  S::cout << "day         = " << ymd.day() << '\n';
  S::cout << "hour        = " << time.hours().count() << "h\n";
  S::cout << "minute      = " << time.minutes().count() << "min\n";
  S::cout << "second      = " << time.seconds().count() << "s\n";
  S::cout << "millisecond = " << time.subseconds().count() << "ms\n";
}</code>

C 20 標準ライブラリ サポート

C 20 では、system_ Clock::time_point:

以上が`std::chrono::time_point` オブジェクトから時間コンポーネントを抽出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。