C++20时间:如何比较时间点和月份日期



是否有一种现代而优雅的方法来确定time_point变量中的是否与给定的month_day变量匹配?

例如,我想知道今天是否是圣诞节。我有以下代码:

#include <chrono>
bool IsTodayChristmas()
{
using namespace std::chrono;
constexpr month_day Christmas = {December / 25};
auto Now = system_clock::now();
// return Now == Christmas; // How to?
}

现代优雅:我的意思是,如果可能的话,我宁愿不使用旧的C类型(比如std::time_tstd::tm(和字符串比较(比如std::put_time(。

如有任何帮助,我们将不胜感激。

您可以通过std::chrono::sys_dayssystem_clock::now()转换为std::chrono::year_month_day类型。在实践中,这可能看起来像

#include <chrono>
bool IsTodayChristmas() {
using namespace std::chrono;
constexpr month_day Christmas = {December / 25};
auto Now = year_month_day{floor<days>(system_clock::now())};
// either
return Now == Christmas / Now.year();
// or
return Now.month() / Now.day() == Christmas;
}

正如霍华德·欣南特所指出的,这将决定UTC的圣诞节。圣诞节后,您更有可能在本地时区:为此,我们必须首先将Now转换为本地时区:(注意,据我所知,std::chrono::current_zone还没有由libstdc++或libc++提供。(

bool IsTodayChristmas() {
using namespace std::chrono;
constexpr month_day Christmas = {December / 25};
auto Now_local = current_zone()->to_local(system_clock::now());
auto Today = year_month_day{floor<days>(Now_local)};
return Today == Christmas / Today.year();
}

相关内容

  • 没有找到相关文章

最新更新