Работа с датами в C++: обзор лучших библиотек для манипуляции временем

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с датами в C++: обзор ключевых библиотек

Работа с датами и временем — одна из фундаментальных задач в программировании. В C++ стандартная библиотека долгое время была ограничена утилитами из C (<ctime>), которые неудобны и небезопасны с точки зрения типов. Начиная с C++11 и особенно C++20, ситуация кардинально изменилась. В этой статье мы рассмотрим три основных подхода к работе с датами в современном C++.

1. Стандартная библиотека <chrono> (C++11 и C++20)

Начиная с C++11, в стандартную библиотеку вошел заголовок <chrono>, предоставляющий типобезопасные часы, моменты времени (time_point) и длительности (duration). В C++20 библиотека была расширена поддержкой календарных типов (год, месяц, день) и часовых поясов.

Основные компоненты:

  • std::chrono::system_clock — системные часы, связанные с реальным временем.
  • std::chrono::steady_clock — монотонные часы для измерения интервалов.
  • std::chrono::duration — промежуток времени (например, секунды, миллисекунды).
  • std::chrono::time_point — точка во времени.
  • Календарные типы (C++20): year_month_day, hh_mm_ss и другие.
#include <iostream>
#include <chrono>
#include <format> // C++20

int main() {
    using namespace std::chrono;

    // Текущее время
    auto now = system_clock::now();
    std::cout << "Текущее время: " << now << "\n";

    // Преобразование в календарную дату (C++20)
    auto dp = floor<days>(now);
    year_month_day ymd{dp};
    std::cout << "Год: " << (int)ymd.year() << "\n";

    // Измерение интервала
    auto start = steady_clock::now();
    // ... какой-то код ...
    auto end = steady_clock::now();
    auto diff = end - start;
    std::cout << "Прошло: " << duration_cast<milliseconds>(diff).count() << " мс\n";
    
    return 0;
}

Плюсы: встроена в стандарт, типобезопасна, активно развивается.

Минусы: для C++20 требуется современный компилятор (GCC 12+, Clang 14+, MSVC 2022).

2. Boost.DateTime

Библиотека Boost.DateTime — одна из старейших и наиболее зрелых для работы с датами. До появления C++20 она была де-факто стандартом. Предоставляет классы boost::gregorian::date, boost::posix_time::ptime и полную поддержку часовых поясов.

Основные возможности:

  • Григорианский календарь с поддержкой високосных лет.
  • Манипуляции с датами: сложение дней, месяцев, лет.
  • Форматирование и парсинг через boost::date_time::date_facet.
  • Поддержка часовых поясов через boost::local_time.
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main() {
    using namespace boost::gregorian;
    using namespace boost::posix_time;

    // Создание даты
    date d(2024, 12, 25);
    std::cout << "Дата: " << d << "\n"; // 2024-Dec-25

    // Сложение дней
    date next_week = d + days(7);
    std::cout << "Через неделю: " << next_week << "\n";

    // Разница между датами
    days diff = next_week - d;
    std::cout << "Разница: " << diff.days() << " дней\n";

    // Текущее время с точностью до секунд
    ptime now = second_clock::local_time();
    std::cout << "Сейчас: " << now << "\n";
    
    return 0;
}

Плюсы: проверена временем, обширная документация, работает с C++98.

Минусы: требует установки Boost, синта

Рекомендаций