是否有一种现代而优雅的方法来确定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_t
和std::tm
(和字符串比较(比如std::put_time
(。
如有任何帮助,我们将不胜感激。
您可以通过std::chrono::sys_days
将system_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();
}