Namespaces
Variants

std::chrono::year_month_day:: operator sys_days, std::chrono::year_month_day:: operator local_days

From cppreference.net
constexpr operator std:: chrono :: sys_days ( ) const noexcept ;
(1) (depuis C++20)
constexpr explicit operator std:: chrono :: local_days ( ) const noexcept ;
(2) (depuis C++20)

Convertit * this en un std::chrono::time_point représentant la même date que ce year_month_day .

1) Si ok() est true , la valeur de retour contient un nombre de jours depuis l'époque du std::chrono::system_clock (1970-01-01) jusqu'à * this . Le résultat est négatif si * this représente une date antérieure à celle-ci.
Sinon, si l'année et le mois stockés sont valides ( year ( ) . ok ( ) && month ( ) . ok ( ) est true ), alors la valeur retournée est sys_days ( year ( ) / month ( ) / 1d ) + ( day ( ) - 1d ) .
Sinon (si year ( ) . ok ( ) && month ( ) . ok ( ) est false ), la valeur de retour est non spécifiée.
Un std::chrono::sys_days dans l'intervalle [ std:: chrono :: days { - 12687428 } , std:: chrono :: days { 11248737 } ] , lorsqu'il est converti en year_month_day et reconverti, donne la même valeur.
2) Identique à (1) mais retourne local_days à la place. Équivalent à return local_days ( sys_days ( * this ) . time_since_epoch ( ) ) ; .

Notes

La conversion vers std::chrono::sys_days et inversement peut être utilisée pour normaliser un year_month_day qui contient un jour invalide mais une année et un mois valides :

using namespace std::chrono;
auto ymd = 2017y/January/0;
ymd = sys_days{ymd};
// ymd est maintenant 2016y/December/31

La normalisation de l'année et du mois peut être effectuée en ajoutant (ou en soustrayant) zéro std::chrono::months :

using namespace std::chrono;
constexpr year_month_day normalize(year_month_day ymd)
{
    ymd += months{0}; // normalise l'année et le mois
    return sys_days{ymd}; // normalise le jour
}
static_assert(normalize(2017y/33/59) == 2019y/10/29);

Exemple

#include <chrono>
#include <iostream>
int main()
{
    using namespace std::chrono;
    const auto today = sys_days{std::chrono::floor<days>(system_clock::now())};
    for (const year_month_day ymd : {{November/15/2020}, {November/15/2120}, today})
    {
        std::cout << ymd;
        const auto delta = (sys_days{ymd} - today).count();
        (delta < 0) ? std::cout << " was " << -delta << " day(s) ago\n" :
        (delta > 0) ? std::cout << " is " << delta << " day(s) from now\n"
                    : std::cout << " is today!\n";
    }
}

Sortie possible :

2020-11-15 was 1014 day(s) ago
2120-11-15 is 35510 day(s) from now
2023-08-26 is today!