从 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中文网其他相关文章!