C ++ Chrono确定一天是否是周末?

时间:2018-10-12 09:56:44

标签: c++ chrono

我有一个以年(int),月(int)和天(int)格式的日期,例如2018年10月12日的2018年,10月,12日。

是否可以使用带有这些整数的C ++ Chrono库来确定我的“日期”是否是周末?

否则,最简单的替代方法是什么?

1 个答案:

答案 0 :(得分:3)

在C ++ 20中,您将可以执行以下操作:

#include <chrono>

constexpr
bool
is_weekend(std::chrono::sys_days t)
{
    using namespace std::chrono;
    const weekday wd{t};
    return wd == Saturday || wd == Sunday;
}

int
main()
{
    using namespace std::chrono;
    static_assert(!is_weekend(year{2018}/10/12), "");
    static_assert( is_weekend(year{2018}/10/13), "");
}

很自然地,如果输入不是constexpr,则计算也不能。

据我所知,还没有人发布此脚本,但是您可以使用Howard Hinnant's datetime lib来开始使用这种语法。您只需要#include "date/date.h"并将几个using namespace std::chrono;更改为using namespace date;

#include "date/date.h"

constexpr
bool
is_weekend(date::sys_days t)
{
    using namespace date;
    const weekday wd{t};
    return wd == Saturday || wd == Sunday;
}

int
main()
{
    using namespace date;
    static_assert(!is_weekend(year{2018}/10/12), "");
    static_assert( is_weekend(year{2018}/10/13), "");
}

这将适用于C ++ 17,C ++ 14,并且如果您删除constexpr,C ++ 11。它不会移植到C ++ 11之前的版本,因为它确实取决于<chrono>

对于奖励积分,以上功能也将在当前时间(UTC)起作用:

    assert(!is_weekend(floor<days>(std::chrono::system_clock::now())));