Daily bit(e) C++. std::chrono – представление дат
Daily bit(e) C++ 74, представление и манипуляции с датами с помощью расширения библиотеки std::chrono из C++20 .

В C++20 библиотека std::chrono получила крупное обновление, в котором была добавлена (среди прочего) поддержка представления дат.
Абстрактная (не обязательно допустимая) дата может быть представлена с помощью типа std::chrono::year_month_day, который поддерживает арифметические операции для годов и месяцев.
Абстрактная дата может быть нормализована к системному времени, которое также поддерживает арифметические операции для дней.
Системное время, точность которого усечена до секунд, концептуально представляет собой дату + время (std::chrono::sys_seconds), а точность которого усечена до дней представляет собой только дату (std::chrono::sys_days).
Наконец, для получения дня недели можно создать объект std::chrono::weekday из системного времени.
#include <chrono>
using namespace std::chrono;
// День в году может быть указан с помощью литералов и operator/
auto moon_day = 2024y/July/20d;
// decltype(moon_day) == std::chrono::year_month_day
// std::chrono::year_month_day представляет собой абстрактную дату,
// не привязанную к календарю
auto weird_date = 2024y/June/44d;
// decltype(weird_date) == std::chrono::year_month_day
// weird_date.ok() == false
// Мы можем привести дату в соответствие с системными часами,
// часовые пояса будут рассмотрены в отдельном посте
auto system_date = std::chrono::sys_days{weird_date};
// decltype(system_date) == std::chrono::sys_days
// system_date == 2024/07/14
// std::chrono::sys_days может быть преобразован в день недели
auto day = std::chrono::weekday{system_date};
// day == std::chrono::Sunday
// std::chrono::sys_time представляет собой системное время
std::chrono::sys_time now = std::chrono::system_clock::now();
// Псевдоним для даты и времени
std::chrono::sys_seconds time =
std::chrono::floor<std::chrono::seconds>(now);
// Псевдоним только для даты
std::chrono::sys_days date =
std::chrono::floor<std::chrono::days>(now);
// std::chrono::year_month_day поддерживает арифметические операции
// для годов и месяцев
auto date1 = 2024y/May/1d;
auto date2 = date1 + years{2};
// date2 == 2026/05/01
auto date3 = date1 + months{11};
// date3 == 2025/04/01
// Для дней нам необходимо нормализовать дату к sys_days
for (auto date = 2024y/June/1d;
date.month() == June; // пока в июне
date = sys_days{date} + days{1}) // продолжать добавлять один день
{
// проходимся по всем дням в июне 2024 года
}
