如何用当前年份填充 chrono::year?
Posted
技术标签:
【中文标题】如何用当前年份填充 chrono::year?【英文标题】:How can I Populate a chrono::year With the Current Year? 【发布时间】:2019-02-22 23:09:45 【问题描述】:所以我从this question 了解到,用于构造chrono::year
的整数对应于0 的Anno Domini 原点。
所以我的问题是,如果我想获得当前的chrono::year
怎么办?有那个功能吗?我显然可以做到:
const auto time = std::time(nullptr);
const auto current_date = *std::gmtime(&time);
const chrono::year foo current_date.tm_year + 1900 ;
但这似乎是一个相当复杂的过程。有什么更好的可供我使用吗?
【问题讨论】:
【参考方案1】:using namespace std::chrono;
year_month_day ymd = floor<days>(system_clock::now());
const year foo = ymd.year();
【讨论】:
哇,太聪明了。我喜欢从 C 的时间库中涉及的所有指针传递中解脱出来的想法。 Fwiw,我赞成这个答案。但我也想澄清一下,这是UTC 的当前年份。如果您希望当前年份位于特定时区,则可以使用chrono::zoned_time
(并且偶尔会给您不同的答案)。执行此操作的代码本质上是此答案中提供的代码的超集。
允许year_month_day ymd = floor<days>(system_clock::now())
的演员表是什么?我没有看到 time_point
和 year_mont_day
之间的转换。
year_month_day
有一个隐式的 constexpr noexcept
构造函数,采用单个参数 const sys_days&
。 sys_days
只是 time_point<system_clock, days>
的类型别名。 floor<days>(...)
将 system_clock::time_point
转换为 sys_days
。【参考方案2】:
这是另一种方式:
auto now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
struct tm *parts = std::localtime(&now_c);
std::cout << 1900 + parts->tm_year << std::endl;
【讨论】:
以上是关于如何用当前年份填充 chrono::year?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C++ 中的 std::chrono::year_month_day 获取工作日编号