Maison  >  Article  >  développement back-end  >  Comment extraire des composants de date et d'heure spécifiques, comme l'année, le mois, le jour, les heures, les minutes, les secondes et les millisecondes, à partir d'un objet `std::chrono::time_point` en C ?

Comment extraire des composants de date et d'heure spécifiques, comme l'année, le mois, le jour, les heures, les minutes, les secondes et les millisecondes, à partir d'un objet `std::chrono::time_point` en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 07:59:27757parcourir

How do you extract specific date and time components, like year, month, day, hours, minutes, seconds, and milliseconds, from a `std::chrono::time_point` object in C  ?

Extraction des composants de date et d'heure de std::chrono::time_point

Problème :

Comment pouvons-nous récupérer des composants de date et d'heure, tels que l'année, le mois, le jour, les heures, les minutes, les secondes et les millisecondes, à partir d'un objet std::chrono::time_point ?

Solution :

Pour extraire ces informations, nous devons utiliser system_clock::time_point car c'est la seule horloge fournie par le système qui a une connexion au calendrier civil.

<code class="cpp">system_clock::time_point now = system_clock::now();</code>

Conversion en horodatage :

Ensuite, convertissez le time_point en time_t :

<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>

Extraction des composants :

À l'aide de la bibliothèque C, convertissez le time_t en un tm, en précisant si vous souhaitez une conversion en UTC ou dans le fuseau horaire local :

<code class="cpp">tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&tt);</code>

Maintenant, vous pouvez imprimer les composants du tm :

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

Extraction étendue :

Bien que system_clock soit généralement basé sur l'heure Unix, sa précision est souvent supérieure à quelques secondes. Pour accéder aux composants haute résolution, utilisez le code suivant :

<code class="cpp">using namespace std;
using namespace std::chrono;

int main()
{
    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;

    cout << d.count() << "d " << h.count() << ':'
         << m.count() << ':' << s.count();
    cout << " " << tp.count() << "["
         << system_clock::duration::period::num << '/'
         << system_clock::duration::period::den << "]\n";
}

En convertissant le point_temporel en jours, heures, minutes, secondes et en extrayant la fraction de seconde, ce code génère :

15806d 20:31:14 598155[1/1000000]

Solutions de bibliothèque :

La bibliothèque de dates en en-tête uniquement simplifie ce processus, permettant l'extraction avec le code suivant :

<code class="cpp">#include "date.h"

int main()
{
    auto tp = std::chrono::system_clock::now();
    auto dp = date::floor<date::days>(tp);
    auto ymd = date::year_month_day{dp};
    auto time = date::make_time(std::chrono::duration_cast<std::chrono::milliseconds>(tp - dp));

    std::cout << "year        = " << ymd.year() << '\n';
    std::cout << "month       = " << ymd.month() << '\n';
    std::cout << "day         = " << ymd.day() << '\n';
    std::cout << "hour        = " << time.hours().count() << "h\n";
    std::cout << "minute      = " << time.minutes().count() << "min\n";
    std::cout << "second      = " << time.seconds().count() << "s\n";
    std::cout << "millisecond = " << time.subseconds().count() << "ms\n";
}

Intégration C 20 :

En C 20, une syntaxe proposée est incluse pour extraire ces champs à l'aide de system_clock::time_point:

<code class="cpp">#include <chrono>

int main()
{
    using namespace std::chrono;
    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>

De plus, vous pouvez spécifier une heure préférée zone pour l'extraction.

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