首页 >后端开发 >C++ >如何从 std::chrono::time_point 中提取时间分量?

如何从 std::chrono::time_point 中提取时间分量?

DDD
DDD原创
2024-10-30 23:39:29568浏览

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

从 std::chrono::time_point 中提取时间分量

对于 system_clock::time_points,std::chrono 库不会直接提供提取时间成分(例如年、月和日)的功能。但是,可以通过利用系统时钟和民用日历之间的底层关系来检索这些组件。

使用 C 库提取组件

一种方法涉及转换 time_point time_t,表示 UTC 时区自 1970 年新年以来的秒数。使用 C 库的时间操作函数,您可以将 time_t 转换为 tm 结构,其中包含年、月和日等组件。以下代码演示了这种方法:

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

提取 Unix 纪元时间分量

通过认识到现代系统中使用的大多数系统时钟都是基于Unix 纪元时间,表示自 UTC 1970 年 1 月 1 日以来的秒数。虽然 std::chrono 不提供直接访问该值的方法,但可以通过从纪元以来经过的总时间中减去来提取组件。

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

使用仅标头的 C 11/14 库

仅日期的标头库提供了更方便的解决方案,允许您轻松提取这些组件:

<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库功能(即将推出)

在即将推出的 C 20 标准中,支持从 system_clock::time_point 直接提取时间分量。语法如下:

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

以上是如何从 std::chrono::time_point 中提取时间分量?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn