Расчет даты в будущем или прошлом

C++:
Расчет даты в будущем или прошлом

Как это сделать:

C++20 представил обновления библиотеки <chrono>, так что работа с временем стала менее обременительной. Вот быстрый пример добавления дней к текущей дате:

#include <iostream>
#include <chrono>
#include <format>

using namespace std::chrono;

int main() {
    // Получить сегодняшнюю дату
    auto today = floor<days>(system_clock::now());
    
    // Добавить к сегодняшней дате 30 дней
    auto future_date = today + days(30);
    
    // Преобразовать в time_point для вывода с использованием system_clock
    auto tp = system_clock::time_point(future_date);
    
    // Вывод
    std::cout << "Сегодняшняя дата: "
              << std::format("{:%F}\n", today);
    std::cout << "Будущая дата (через 30 дней): "
              << std::format("{:%F}\n", tp);
    return 0;
}

Пример вывода:

Сегодняшняя дата: 2023-03-15
Будущая дата (через 30 дней): 2023-04-14

Вычитание дней работает аналогично - нужно использовать - вместо +.

Подробнее

До C++20 возможно, вы бы использовали библиотеку, такую как Boost, для манипуляции с датами. Но обновлённый <chrono> упрощает это с помощью system_clock, year_month_day и типов duration.

Исторически, расчёт дат был сложным из-за ручного управления разной длительностью месяцев, високосными годами и часовыми поясами. <chrono> в C++20 решает эти проблемы, предоставляя поддержку календаря и часовых поясов.

Альтернативы? Вы всё ещё можете использовать Boost или даже создавать свою собственную логику работы с датами (авантюрно, но зачем?). Также есть сторонние библиотеки, такие как библиотека “date” Говарда Хиннанта, которая оказала влияние на обновления chrono в C++20.

С точки зрения реализации, <chrono> определяет длительности как константы времени компиляции в рациональных числах, избегая проблем с плавающей точкой. Типы, такие как year_month_day, основаны на sys_days, который представляет собой time_point в виде дней с общей эпохи (1970-01-01).

Смотрите также