Maison >développement back-end >C++ >Comment extraire les composants temporels d'un std::chrono::time_point ?

Comment extraire les composants temporels d'un std::chrono::time_point ?

DDD
DDDoriginal
2024-10-30 23:39:29568parcourir

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

Extraction de composants temporels à partir d'un std::chrono::time_point

Pour system_clock::time_points, la bibliothèque std::chrono ne le fait pas fournissent directement des fonctionnalités pour extraire des composants temporels tels que l’année, le mois et le jour. Cependant, il est possible de récupérer ces composants en exploitant la relation sous-jacente entre les horloges système et le calendrier civil.

Extraction de composants à l'aide de la bibliothèque C

Une méthode consiste à convertir le point_heure à un time_t, représentant le nombre de secondes depuis le Nouvel An 1970 dans le fuseau horaire UTC. À l'aide des fonctions de manipulation du temps de la bibliothèque C, vous pouvez ensuite convertir le time_t en une structure tm, qui contient des composants tels que l'année, le mois et le jour. Le code suivant illustre cette approche :

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

Extraction des composants temporels d'époque Unix

Des composants précis peuvent être obtenus en reconnaissant que la plupart des horloges système utilisées dans les systèmes modernes sont basées sur l'heure d'époque Unix, qui représente le nombre de secondes depuis le 1er janvier 1970 UTC. Bien que std::chrono ne fournisse pas de méthodes pour accéder directement à cette valeur, il est possible d'extraire des composants en soustrayant du temps total écoulé depuis l'époque.

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

Utilisation d'un en-tête uniquement C 11/14 Bibliothèque

La bibliothèque d'en-tête et de date uniquement offre une solution plus pratique, vous permettant d'extraire facilement ces composants :

<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 Fonctionnalités de la bibliothèque (à venir)

Dans la prochaine norme C 20, l'extraction directe des composants temporels de system_clock::time_point est prise en charge. La syntaxe est la suivante :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn