Daily bit(e) C++. std::chrono – представление дат

Добавлено 15 августа 2026 в 06:18

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

Daily bit(e) C++

В 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 года
}

Пример на Compiler Explorer

Теги

C++ / CppchronoDaily bit(e) C++Программирование