Heim >Backend-Entwicklung >C++ >Wie extrahiere ich zeitliche Komponenten aus einem std::chrono::time_point?

Wie extrahiere ich zeitliche Komponenten aus einem std::chrono::time_point?

DDD
DDDOriginal
2024-10-30 23:39:29574Durchsuche

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

Zeitkomponenten aus einem std::chrono::time_point extrahieren

Für system_clock::time_points ist dies in der std::chrono-Bibliothek nicht der Fall Bietet direkt Funktionen zum Extrahieren von Zeitkomponenten wie Jahr, Monat und Tag. Es ist jedoch möglich, diese Komponenten abzurufen, indem die zugrunde liegende Beziehung zwischen Systemuhren und dem Zivilkalender ausgenutzt wird.

Extrahieren von Komponenten mithilfe der C-Bibliothek

Eine Methode besteht darin, den time_point zu konvertieren zu einem time_t, der die Anzahl der Sekunden seit Neujahr 1970 in der UTC-Zeitzone darstellt. Mit den Zeitmanipulationsfunktionen der C-Bibliothek können Sie dann time_t in eine tm-Struktur konvertieren, die Komponenten wie Jahr, Monat und Tag enthält. Der folgende Code demonstriert diesen Ansatz:

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

Extrahieren von Unix-Epochenzeitkomponenten

Präzise Komponenten können erhalten werden, indem man erkennt, dass die meisten in modernen Systemen verwendeten Systemuhren darauf basieren auf Unix-Epochenzeit, die die Anzahl der Sekunden seit dem 1. Januar 1970 UTC darstellt. Während std::chrono keine Methoden für den direkten Zugriff auf diesen Wert bereitstellt, ist es möglich, Komponenten durch Subtrahieren von der seit der Epoche verstrichenen Gesamtzeit zu extrahieren.

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

Verwendung eines Nur-Header-C 11/14-Bibliothek

Die Nur-Datums-Header-Bibliothek bietet eine bequemere Lösung, mit der Sie diese Komponenten einfach extrahieren können:

<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 Standard Bibliotheksfunktionen (in Kürze erhältlich)

Im kommenden C 20-Standard wird die direkte Extraktion zeitlicher Komponenten aus system_clock::time_point unterstützt. Die Syntax lautet wie folgt:

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

Das obige ist der detaillierte Inhalt vonWie extrahiere ich zeitliche Komponenten aus einem std::chrono::time_point?. 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