Heim >Backend-Entwicklung >C++ >Wie extrahiere ich zeitliche Komponenten aus einem 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!