Namespaces
Variants

std::chrono::year_month_day:: ok

From cppreference.net
constexpr bool ok ( ) const noexcept ;
(depuis C++20)

Vérifie si cet objet year_month_day représente une date calendaire valide.

Valeur de retour

true si cet objet year_month_day représente une date calendaire valide, c'est-à-dire que les valeurs stockées pour l'année, le mois et le jour sont toutes valides et que la valeur du jour stockée se situe dans le nombre de jours du mois et de l'année donnés. Sinon false .

Implémentation possible

constexpr bool std::chrono::year_month_day::ok() const noexcept
{
    return year().ok() && month().ok() && day().ok() &&
        day() <= (year()/month()/std::chrono::last).day();
}

Exemple

#include <chrono>
int main()
{
    constexpr auto ymd1 {std::chrono::day(1)/std::chrono::July/2020};
    static_assert(ymd1.ok());
    constexpr auto ymd2 {std::chrono::year(2020)/7/42};
    static_assert(not ymd2.ok());
    constexpr auto ymd3 {std::chrono::February/29/2020}; // ok, année bissextile
    static_assert(ymd3.ok());
    constexpr auto ymd4 = ymd3 + std::chrono::years{1}; // incorrect, pas une année bissextile
    static_assert(ymd4 == std::chrono::February/29/2021 and not ymd4.ok());
    // pour corriger la date incorrecte nous pouvons nous aligner sur le dernier jour du mois :
    if constexpr (!ymd4.ok())
    {
        constexpr auto ymd = ymd4.year()/ymd4.month()/std::chrono::last;
        static_assert(ymd == std::chrono::February/28/2021 and ymd.ok());
    }
    // ou nous pouvons déborder vers le mois suivant :
    if constexpr (!ymd4.ok())
    {
        constexpr auto st = std::chrono::sys_time<std::chrono::days>{ymd4};
        constexpr auto ymd = std::chrono::year_month_day{st};
        static_assert(ymd == std::chrono::March/1/2021 and ymd.ok());
    }
}