Home > Backend Development > C++ > 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 ?

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 ?

Barbara Streisand
Release: 2024-10-30 07:59:27
Original
861 people have browsed it

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  ?

Extracting Date and Time Components from std::chrono::time_point

Problem:

How can we retrieve specific date and time components, such as year, month, day, hours, minutes, seconds, and milliseconds, from an std::chrono::time_point object?

Solution:

To extract this information, we must utilize the system_clock::time_point as it's the only system-supplied clock that has a connection to the civil calendar.

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

Converting to a Time Stamp:

Next, convert the time_point to a time_t:

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

Extracting Components:

Using the C library, convert the time_t to a tm, specifying whether you want conversion in UTC or the local time zone:

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

Now, you can print the components of the 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';
Copy after login

Extended Extraction:

While system_clock is typically based on Unix time, its precision is often greater than seconds. To access the high-resolution components, use the following code:

<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";
}
Copy after login

By converting the time_point to days, hours, minutes, seconds, and extracting the fraction of a second, this code outputs:

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

Library Solutions:

The header-only date library simplifies this process, allowing the extraction with the following code:

<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";
}
Copy after login

C 20 Integration:

In C 20, a proposed syntax is included for extracting these fields using 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>
Copy after login

Additionally, you can specify a preferred time zone for the extraction.

The above is the detailed content of 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 ?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template