Heim  >  Artikel  >  Backend-Entwicklung  >  Wie extrahieren Sie bestimmte Datums- und Zeitkomponenten wie Jahr, Monat, Tag, Stunden, Minuten, Sekunden und Millisekunden aus einem „std::chrono::time_point“-Objekt in C?

Wie extrahieren Sie bestimmte Datums- und Zeitkomponenten wie Jahr, Monat, Tag, Stunden, Minuten, Sekunden und Millisekunden aus einem „std::chrono::time_point“-Objekt in C?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 07:59:27757Durchsuche

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  ?

Datums- und Uhrzeitkomponenten aus std::chrono::time_point extrahieren

Problem:

Wie können wir bestimmte Daten abrufen? Datums- und Zeitkomponenten wie Jahr, Monat, Tag, Stunden, Minuten, Sekunden und Millisekunden aus einem std::chrono::time_point-Objekt?

Lösung:

Um diese Informationen zu extrahieren, müssen wir system_clock::time_point verwenden, da es sich um die einzige vom System bereitgestellte Uhr handelt, die eine Verbindung zum Zivilkalender hat.

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

Konvertierung in einen Zeitstempel :

Als nächstes konvertieren Sie den time_point in einen time_t:

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

Extrahieren von Komponenten:

Konvertieren Sie mithilfe der C-Bibliothek die time_t in eine tm umwandeln und dabei angeben, ob Sie eine Konvertierung in UTC oder in die lokale Zeitzone wünschen:

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

Jetzt können Sie die Komponenten der tm ausdrucken:

<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';

Erweiterte Extraktion:

Während system_clock normalerweise auf der Unix-Zeit basiert, ist seine Genauigkeit oft größer als Sekunden. Um auf die hochauflösenden Komponenten zuzugreifen, verwenden Sie den folgenden Code:

<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";
}

Durch Konvertieren des time_point in Tage, Stunden, Minuten, Sekunden und Extrahieren des Bruchteils einer Sekunde gibt dieser Code Folgendes aus:

15806d 20:31:14 598155[1/1000000]

Bibliothekslösungen:

Die Nur-Header-Datumsbibliothek vereinfacht diesen Prozess und ermöglicht die Extraktion mit dem folgenden Code:

<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-Integration:

In C 20 ist eine vorgeschlagene Syntax zum Extrahieren dieser Felder mit system_clock::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>

Zusätzlich können Sie eine bevorzugte Zeit angeben Zone für die Extraktion.

Das obige ist der detaillierte Inhalt vonWie extrahieren Sie bestimmte Datums- und Zeitkomponenten wie Jahr, Monat, Tag, Stunden, Minuten, Sekunden und Millisekunden aus einem „std::chrono::time_point“-Objekt in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn