C ++ Chrono определит, будет ли выходной день? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть дата в форме год (int), месяц (int) и день (int), например, 2018, 10, 12 за 12 октября 2018 года.

Есть ли способ, которым яМожно ли использовать библиотеку C ++ Chrono с этими целыми числами, чтобы определить, является ли моя «дата» выходным днем?

Если нет, то какой самый простой альтернативный способ добиться этого?

1 Ответ

0 голосов
/ 12 октября 2018

В 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, тогда вычисление также не может быть.

Никто из тех, о ком я знаю, еще не отправляет это, однако вы можете получить преимущество с этим синтаксисом, используя 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())));
...