C++ 20 chrono:如何将 time_point 与 month_day 进行比较?

Spr*_*ite 14 c++ date c++-chrono 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?
}
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激。

N. *_*ead 19

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

正如 Howard Hinnant 指出的那样,这将决定 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我支持你!:-) (5认同)
  • 如果您需要知道除您本地时间或 UTC 之外的某个地方是否是圣诞节,请将 `auto Now_local = current_zone()-&gt;to_local(system_clock::now());` 更改为 `auto Now_local =locate_zone( "澳大利亚/悉尼")-&gt;to_local(system_clock::now());`,其他一切都可以保持不变。在处理时间问题时,提出正确的问题往往比得到正确的答案更困难。:-) (4认同)
  • 已投赞成票。:-) 不错的工作。是的,直接使用 `time_zone` current_zone()` 是一个很好的方法。但使用“zoned_time”也是一个好方法。`zoned_time` 本质上是一个比直接使用 `time_zone` 更高级的便利 API。但在这种情况下并不能买到那么多的便利(也不需要花费太多)。无论哪种方式,获取当前本地时间并将其降低到天精度是获取当前本地日期并将其与圣诞节进行比较的正确方法。 (3认同)