Home > Article > Backend Development > 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 ?
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>
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>
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>
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';
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"; }
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]
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"; }
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>
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!