从 std::chrono::time_point 中提取时间元素
查询:
如何从 std::chrono::time_point 对象中提取特定的时间元素,例如年、月、日、小时、分钟、秒和毫秒?
解决方案:
要从 time_point 中提取这些元素,您必须使用 system_clock::time_point,因为它与民用日历有关系。检索当前的 system_clock::time_point:
<code class="cpp">system_clock::time_point now = system_clock::now();</code>
将其转换为 time_t 值:
<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
如果您需要 UTC 时区或本地时区的时间提取,请转换 time_t 值到 tm:
<code class="cpp">tm utc_tm = *gmtime(&tt); // UTC tm local_tm = *localtime(&tt); // Local</code>
使用 tm 结构的相应字段提取特定元素:
<code class="cpp">std::cout << local_tm.tm_year + 1900 << '\n'; // Year std::cout << local_tm.tm_mon + 1 << '\n'; // Month std::cout << local_tm.tm_mday << '\n'; // Day
扩展信息:
而使用 C 库允许时间转换,需要注意的是,每个 system_clock 实现都是基于 Unix 时间,通常以 UTC 时间 1970 年 1 月 1 日以来的秒为单位。
要更精确地提取,请利用system_clock precision:
<code class="cpp">system_clock::duration tp = now.time_since_epoch(); days d = duration_cast<days>(tp); // Days tp -= d; // Subtract days hours h = duration_cast<hours>(tp); // Hours tp -= h; // Subtract hours ... // Continue for minutes, seconds, and fractional seconds</code>
使用适当的持续时间单位打印结果:
<code class="cpp">std::cout << d.count() << "d " << h.count() << ':' << m.count() << ':' << s.count(); std::cout << " " << tp.count() << "[" << system_clock::duration::period::num << '/' << system_clock::duration::period::den << "]\n";
库增强:
为了简化时间提取,考虑使用 C 11/14 库,例如 date。这将必要的代码减少为:
<code class="cpp">auto tp = std::chrono::system_clock::now(); using date::floor; // Namespace for streaming operator std::cout << tp << '\n'; // Outputs date and time components auto dp = floor<date::days>(tp); // Omits fractional parts auto ymd = date::year_month_day{dp}; ... // Individual elements can be accessed as members of ymd</code>
C 20 标准提案:
提议的 C 20 工作草案包括用于从 system_clock 提取这些字段的直接语法:时间点:
<code class="cpp">year_month_day ymd{floor<days>(tp)}; hh_mm_ss time{floor<milliseconds>(tp - dp)}; auto y = ymd.year(); auto m = ymd.month(); ... // Extract remaining elements similarly</code>
以上是如何从 std::chrono::time_point 对象中提取单个时间元素,例如年、月、日、小时、分钟、秒和毫秒?的详细内容。更多信息请关注PHP中文网其他相关文章!