Extraction d'éléments temporels à partir d'un std::chrono::time_point
Requête :
Comment puis-je extraire des éléments temporels spécifiques, tels que l'année, le mois, le jour, l'heure, la minute, la seconde et les millisecondes, à partir d'un objet std::chrono::time_point ?
Résolution :
Pour extraire ces éléments d'un time_point, vous devez utiliser le system_clock::time_point, car il a une relation avec le calendrier civil. Récupérez le system_clock::time_point actuel :
<code class="cpp">system_clock::time_point now = system_clock::now();</code>
Convertissez-le en une valeur time_t :
<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
Si vous avez besoin d'une extraction de l'heure dans le fuseau horaire UTC ou le fuseau horaire local, convertissez la valeur time_t vers une tm :
<code class="cpp">tm utc_tm = *gmtime(&tt); // UTC tm local_tm = *localtime(&tt); // Local</code>
Extraire des éléments spécifiques à l'aide des champs correspondants de la structure tm :
<code class="cpp">std::cout << local_tm.tm_year + 1900 << '\n'; // Year std::cout << local_tm.tm_mon + 1 << '\n'; // Month std::cout << local_tm.tm_mday << '\n'; // Day
Informations détaillées :
Alors l'utilisation de la bibliothèque C permet la conversion de l'heure, il est important de noter que chaque implémentation de system_clock est basée sur l'heure Unix, généralement mesurée en secondes depuis le 1er janvier 1970 UTC.
Pour une extraction plus précise, profitez de l'option précision system_clock :
<code class="cpp">system_clock::duration tp = now.time_since_epoch(); days d = duration_cast<days>(tp); // Days tp -= d; // Subtract days hours h = duration_cast<hours>(tp); // Hours tp -= h; // Subtract hours ... // Continue for minutes, seconds, and fractional seconds</code>
Imprimez les résultats avec les unités de durée appropriées :
<code class="cpp">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";
Améliorations de la bibliothèque :
Pour une extraction simplifiée du temps, pensez à utiliser une bibliothèque C 11/14 telle que date. Cela réduit le code nécessaire à :
<code class="cpp">auto tp = std::chrono::system_clock::now(); using date::floor; // Namespace for streaming operator std::cout << tp << '\n'; // Outputs date and time components auto dp = floor<date::days>(tp); // Omits fractional parts auto ymd = date::year_month_day{dp}; ... // Individual elements can be accessed as members of ymd</code>
Proposition de norme C 20 :
Le projet de travail C 20 proposé inclut une syntaxe directe pour extraire ces champs de system_clock : time_point :
<code class="cpp">year_month_day ymd{floor<days>(tp)}; hh_mm_ss time{floor<milliseconds>(tp - dp)}; auto y = ymd.year(); auto m = ymd.month(); ... // Extract remaining elements similarly</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!