Maison > développement back-end > 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 ?

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
Libérer: 2024-10-30 07:59:27
original
855 Les gens l'ont consulté

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

Conversion en horodatage :

Ensuite, convertissez le time_point en time_t :

<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
Copier après la connexion

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

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

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

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

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

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal