Maison > développement back-end > C++ > le corps du texte

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

DDD
Libérer: 2024-10-30 23:39:29
original
488 Les gens l'ont consulté

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';
Copier après la connexion

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';
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!