Ziel:Erfassen von Jahr, Monat, Tag, Stunde, Minute, Sekunde , und Millisekunden von einem std::chrono::time_point-Objekt.
Lösung:
Um diese Informationen zu extrahieren, benötigen Sie speziell einen system_clock::time_point und stellen einen bereit Beziehung zum zivilen Kalendersystem.
<code class="cpp">using namespace std::chrono; system_clock::time_point now = system_clock::now();</code>
Der nächste Schritt ist die Konvertierung in eine time_t mit:
<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
Verwenden Sie die C-Bibliothek, um time_t in tm zu konvertieren und so die richtige Zeit sicherzustellen Zone ist ausgewählt:
<code class="cpp">tm utc_tm = *gmtime(&tt); tm local_tm = *localtime(&tt);</code>
Jetzt können Sie die Komponenten von tm extrahieren:
<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';
Darüber hinaus, wenn Sie möchten, können Sie kann sich auf den folgenden nicht garantierten Ansatz verlassen:
Jede den meisten bekannten Implementierungen von system_clock basiert auf der Unix-Zeit (der Anzahl der Sekunden seit dem 1. Januar 1970 UTC), normalerweise mit einer feineren Genauigkeit als Sekunden.
Das folgende umfassende Programm bietet ein Beispiel für das Extrahieren aller zeitlichen Komponenten:
<code class="cpp">#include <chrono> #include <ctime> #include <iostream> int main() { using namespace std::chrono; 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; std::cout << d.count() << "d " << h.count() << ':' << m.count() << ':' << s.count(); std::cout << " " << tp.count() << "[" << system_clock::duration::period::num << '/' << system_clock::duration::period::den << "]\n"; time_t tt = system_clock::to_time_t(now); tm utc_tm = *gmtime(&tt); tm local_tm = *localtime(&tt); std::cout << utc_tm.tm_year + 1900 << '-'; std::cout << utc_tm.tm_mon + 1 << '-'; std::cout << utc_tm.tm_mday << ' '; std::cout << utc_tm.tm_hour << ':'; std::cout << utc_tm.tm_min << ':'; std::cout << utc_tm.tm_sec << '\n'; }</code>
Um Tage zu modellieren, erstellen Sie eine benutzerdefinierte Dauer:
<code class="cpp">typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;</code>
Jetzt können Sie die Zeit seit der Epoche mit der Genauigkeit von system_clock::duration ermitteln:
<code class="cpp">system_clock::duration tp = now.time_since_epoch();</code>
Kürzung auf Tage und Subtraktion:
<code class="cpp">days d = duration_cast<days>(tp); tp -= d;</code>
Wiederholen Sie dies Prozess für Stunden, Minuten und Sekunden.
Der Rest ist der Bruchteil einer Sekunde in den Einheiten von system_clock::duration.
Dieser C Die 11/14-Bibliothek optimiert den oben genannten Prozess:
<code class="cpp">#include "date.h" #include <iostream> int main() { using C = std::chrono; using D = date; using S = std; auto tp = C::system_clock::now(); { using namespace date; S::cout << tp << '\n'; } 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 führt eine standardisierte Syntax zum Extrahieren dieser Felder aus einem system_clock::time_point:
Das obige ist der detaillierte Inhalt vonWie kann ich zeitliche Komponenten aus einem „std::chrono::time_point'-Objekt extrahieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!