代码之家  ›  专栏  ›  技术社区  ›  Sprite SeanRamey

C++ 20的计时:如何比较时间点和月日?

  •  5
  • Sprite SeanRamey  · 技术社区  · 3 年前

    有没有一种现代而优雅的方法来判断 白天 在一个 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 ).

    1 回复  |  直到 3 年前
        1
  •  7
  •   N. Shead    3 年前

    你可以转换 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;
    }
    

    正如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();
    }