简体   繁体   English

C++ 20 chrono:如何比较 time_point 和 month_day?

[英]C++ 20 chrono: How to compare time_point with month_day?

Is there a modern and elegant way to determine if the month and day in a time_point variable match a given month_day variable?是否有一种现代而优雅的方法来确定month_day变量中的月份日期是否与给定的time_point变量匹配?

For example, I want to know if today is Christmas.例如,我想知道今天是不是圣诞节。 I have the following code:我有以下代码:

#include <chrono>

bool IsTodayChristmas()
{
    using namespace std::chrono;

    constexpr month_day Christmas = {December / 25};
    auto Now = system_clock::now();

    // return Now == Christmas; // How to?
}

Modern and elegant: I mean if possible, I would prefer not to use old C types (something like std::time_t and std::tm ) and string comparisons (something like std::put_time ).现代而优雅:我的意思是,如果可能的话,我宁愿不使用旧的 C 类型(类似于std::time_tstd::tm )和字符串比较(类似于std::put_time )。

Any help would be appreciated.任何帮助,将不胜感激。

You can convert system_clock::now() to a std::chrono::year_month_day type via a std::chrono::sys_days .您可以通过std::chrono::sys_days chrono::sys_days 将system_clock::now()转换为std::chrono::year_month_day类型。 In practice this might look something like在实践中,这可能看起来像

#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;
}

As Howard Hinnant pointed out, this will determine Christmas in UTC.正如 Howard Hinnant 指出的那样,这将决定 UTC 的圣诞节。 You're more likely to be after Christmas in the local time zone: to do so, we must first transform Now into our local time zone: (Note std::chrono::current_zone is not yet provided by libstdc++ or libc++, as far as I can tell.)您更有可能在本地时区的圣诞节之后:为此,我们必须首先将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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 从C ++中的std :: chrono :: time_point中提取年/月/日等 - Extract year/month/day etc. from std::chrono::time_point in C++ 如何从年、月、日、小时、分钟、秒、毫秒中获取计时时间点? - How to get chrono time_point from year, month, day, hour, minute, second, millisecond? C++ 如何将日期从输入(字符串年、字符串月、字符串日)转换为 time_point - C++ How to convert date from input (string year, string month, string day) to time_point 如何获取 std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> 来自年、月、日、小时、分钟和秒的变量?</std::chrono::system_clock,> - How to get std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> from variables of year,month,day,hour,minute and seconds? C++ 打印 chrono::time_point<chrono::high_resolution_clock> 可读</chrono::high_resolution_clock> - C++ print chrono::time_point<chrono::high_resolution_clock> to be readable 将 C# 日期时间转换为 C++ std::chrono::system_clock::time_point - Convert C# DateTime to C++ std::chrono::system_clock::time_point C++ 将月份添加到 chrono::system_clock::time_point - C++ Add months to chrono::system_clock::time_point C ++将字符串时间戳转换为std :: chrono :: system_clock :: time_point - C++ Convert a string timestamp to std::chrono::system_clock::time_point c ++ chrono存储time_point表达式必须是可修改的左值 - c++ chrono storing time_point expression must be modifiable lvalue C++ std::tm 从 std::chrono::time_point 转换后返回错误值 - C++ std::tm returns wrong value after converting it from std::chrono::time_point
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM