首页 >后端开发 >C++ >如何从 C 中的'std::chrono::time_point”对象中提取特定的日期和时间组件,例如年、月、日、小时、分钟、秒和毫秒?

如何从 C 中的'std::chrono::time_point”对象中提取特定的日期和时间组件,例如年、月、日、小时、分钟、秒和毫秒?

Barbara Streisand
Barbara Streisand原创
2024-10-30 07:59:27864浏览

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  ?

从 std::chrono::time_point 中提取日期和时间组件

问题:

我们如何检索特定的来自 std::chrono::time_point 对象的日期和时间组件,例如年、月、日、小时、分钟、秒和毫秒?

解决方案:

要提取此信息,我们必须利用 system_clock::time_point,因为它是系统提供的唯一与民用日历连接的时钟。

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

转换为时间戳:

接下来,将 time_point 转换为 time_t:

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

提取组件:

使用 C 库,将time_t 到 tm,指定是否要以 UTC 或本地时区进行转换:

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

现在,您可以打印 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';

扩展提取:

虽然 system_clock 通常基于 Unix 时间,但其精度通常大于秒。要访问高分辨率组件,请使用以下代码:

<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";
}

通过将 time_point 转换为天、小时、分钟、秒,并提取秒的小数部分,此代码输出:

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

库解决方案:

仅标头日期库简化了此过程,允许使用以下代码进行提取:

<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";
}

C 20 集成:

在 C 20 中,包含建议的语法,用于使用 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>

此外,您可以指定首选时间提取区。

以上是如何从 C 中的'std::chrono::time_point”对象中提取特定的日期和时间组件,例如年、月、日、小时、分钟、秒和毫秒?的详细内容。更多信息请关注PHP中文网其他相关文章!

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