Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann ich zeitliche Komponenten aus einem „std::chrono::time_point'-Objekt extrahieren?

Susan Sarandon
Freigeben: 2024-11-02 18:58:31
Original
429 Leute haben es durchsucht

How can I extract temporal components from a `std::chrono::time_point` object?

Zeitkomponenten aus std::chrono::time_point extrahieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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(&amp;tt);
tm local_tm = *localtime(&amp;tt);</code>
Nach dem Login kopieren

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';
Nach dem Login kopieren

Systemuhrkomponenten extrahieren

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(&amp;tt);
  tm local_tm = *localtime(&amp;tt);
  std::cout << utc_tm.tm_year + 1900 <&lt '-';
  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>
Nach dem Login kopieren

Verwenden einer benutzerdefinierten Dauer

Um Tage zu modellieren, erstellen Sie eine benutzerdefinierte Dauer:

<code class="cpp">typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Kürzung auf Tage und Subtraktion:

<code class="cpp">days d = duration_cast<days>(tp);
tp -= d;</code>
Nach dem Login kopieren

Wiederholen Sie dies Prozess für Stunden, Minuten und Sekunden.

Der Rest ist der Bruchteil einer Sekunde in den Einheiten von system_clock::duration.

Verwenden einer Datumsbibliothek

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>
Nach dem Login kopieren

C 20 Standard Library Support

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage