首页 > 后端开发 > C++ > 正文

如何从 std::chrono::time_point 对象中提取单个时间元素,例如年、月、日、小时、分钟、秒和毫秒?

Mary-Kate Olsen
发布: 2024-11-01 06:05:02
原创
504 人浏览过

How can I extract individual temporal elements like year, month, day, hour, minute, second, and milliseconds from an std::chrono::time_point object?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!