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

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

DDD
DDDオリジナル
2024-10-30 23:39:29489ブラウズ

How do I extract temporal components from a std::chrono::time_point?

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

system_ Clock::time_points の場合、std::chrono ライブラリは年、月、日などの時間コンポーネントを抽出する機能を直接提供します。ただし、システム クロックと常用カレンダーの間の基礎的な関係を利用することで、これらのコンポーネントを取得することは可能です。

C ライブラリを使用したコンポーネントの抽出

1 つの方法には、time_point の変換が含まれます。 UTC タイムゾーンでの 1970 年の新年からの秒数を表す time_t に変換します。 C ライブラリの時間操作関数を使用すると、time_t を、年、月、日などのコンポーネントを含む tm 構造体に変換できます。次のコードは、このアプローチを示しています。

<code class="cpp">system_clock::time_point now = system_clock::now();

time_t tt = system_clock::to_time_t(now);
tm utc_tm = *gmtime(&tt); // Convert to UTC time

std::cout << utc_tm.tm_year + 1900 << '\n';
std::cout << utc_tm.tm_mon + 1 << '\n';
std::cout << utc_tm.tm_mday << '\n';

Unix エポック時間コンポーネントの抽出

最新のシステムで使用されているほとんどのシステム クロックがベースであることを認識することで、正確なコンポーネントを取得できます。 Unix エポック時間。UTC 1970 年 1 月 1 日からの秒数を表します。 std::chrono にはこの値に直接アクセスするメソッドがありませんが、エポックからの経過時間の合計から減算することでコンポーネントを抽出することができます。

<code class="cpp">typedef duration<int, ratio_multiply<hours::period, ratio<24>>> 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;

// Remaining portion of a second with system_clock::duration precision
std::cout << d.count() << "d " << h.count() << ':'
          << m.count() << ':' << s.count() << '\n';

ヘッダーのみの C の使用11/14 ライブラリ

日付のみ、ヘッダーのみのライブラリは、より便利なソリューションを提供し、これらのコンポーネントは簡単に作成できます:

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

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

    auto tp = C::system_clock::now();

    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 がサポートされています。構文は次のとおりです:

<code class="cpp">auto tp = system_clock::now();

auto dp = floor<days>(tp);
year_month_day ymd{dp};
hh_mm_ss time{floor<milliseconds>(tp - dp)};

auto y = ymd.year();
auto m = ymd.month();
auto d = ymd.day();
auto h = time.hours();
auto M = time.minutes();
auto s = time.seconds();
auto ms = time.subseconds();</code>

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

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