C の `std::chrono::time_point` オブジェクトから年、月、日、時、分、秒、ミリ秒などの特定の日付と時刻のコンポーネントを抽出するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-30 07:59:27
オリジナル
763 人が閲覧しました

How do you extract specific date and time components, like year, month, day, hours, minutes, seconds, and milliseconds, from a `std::chrono::time_point` object in C  ?

std::chrono::time_point からの日付と時刻のコンポーネントの抽出

問題:

特定の日付と時刻のコンポーネントを取得するにはどうすればよいですかstd::chrono::time_point オブジェクトからの年、月、日、時、分、秒、ミリ秒などの日付と時刻のコンポーネント?

解決策:

この情報を抽出するには、システムが提供する唯一のシステム提供の時計であり、シビルカレンダーに接続されているため、system_ Clock::time_point を利用する必要があります。

<code class="cpp">system_clock::time_point now = system_clock::now();</code>
ログイン後にコピー

タイムスタンプへの変換:

次に、time_point を time_t に変換します:

<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
ログイン後にコピー

コンポーネントの抽出:

C ライブラリを使用して、 time_t を tm に変換し、UTC で変換するかローカル タイム ゾーンで変換するかを指定します:

<code class="cpp">tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&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 時間に基づいていますが、その精度は多くの場合秒を超えます。高解像度コンポーネントにアクセスするには、次のコードを使用します。

<code class="cpp">using namespace std;
using namespace std::chrono;

int main()
{
    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;

    cout << d.count() << "d " << h.count() << ':'
         << m.count() << ':' << s.count();
    cout << " " << tp.count() << "["
         << system_clock::duration::period::num << '/'
         << system_clock::duration::period::den << "]\n";
}
ログイン後にコピー

time_point を日、時間、分、秒に変換し、秒の小数部分を抽出することにより、このコードは次の出力を出力します。

15806d 20:31:14 598155[1/1000000]
ログイン後にコピー

ライブラリ ソリューション:

ヘッダーのみの日付ライブラリはこのプロセスを簡略化し、次のコードで抽出できるようにします:

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

int main()
{
    auto tp = std::chrono::system_clock::now();
    auto dp = date::floor<date::days>(tp);
    auto ymd = date::year_month_day{dp};
    auto time = date::make_time(std::chrono::duration_cast<std::chrono::milliseconds>(tp - dp));

    std::cout << "year        = " << ymd.year() << '\n';
    std::cout << "month       = " << ymd.month() << '\n';
    std::cout << "day         = " << ymd.day() << '\n';
    std::cout << "hour        = " << time.hours().count() << "h\n";
    std::cout << "minute      = " << time.minutes().count() << "min\n";
    std::cout << "second      = " << time.seconds().count() << "s\n";
    std::cout << "millisecond = " << time.subseconds().count() << "ms\n";
}
ログイン後にコピー

C 20 統合:

C 20 では、system_lock::time_point:

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

int main()
{
    using namespace std::chrono;
    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>
ログイン後にコピー

を使用してこれらのフィールドを抽出するための提案された構文が含まれています。さらに、希望の時間を指定することもできます抽出用のゾーン。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!