Работа с датами и временем в C++: полное руководство

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

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

Начать курс

Работа с датами и временем в C++: от классики до современного стандарта

Управление датами и временем — одна из ключевых задач в разработке программного обеспечения. Будь то логирование событий, расчёт дедлайнов, работа с таймерами или анализ данных — без надёжного инструментария не обойтись. В C++ для этого существует несколько подходов: от классической библиотеки <ctime> до современного <chrono>, появившегося в C++11 и значительно расширенного в C++20. В этой статье мы разберём основные методы работы с датами и временем, приведём практические примеры и покажем, как избежать типичных ошибок.

1. Классический подход: библиотека <ctime>

Библиотека <ctime> пришла в C++ из языка C. Она предоставляет простые, но ограниченные средства для работы с календарным временем. Основные типы: std::time_t (целое число секунд с 1 января 1970 года) и std::tm (структура с полями год, месяц, день, часы, минуты, секунды и т.д.).

Пример 1: Получение текущего времени и форматирование

#include <iostream>
#include <ctime>

int main() {
    // Получаем текущее время
    std::time_t now = std::time(nullptr);
    
    // Преобразуем в локальное время
    std::tm* local = std::localtime(&now);
    
    // Выводим в формате "ГГГГ-ММ-ДД ЧЧ:ММ:СС"
    char buffer[80];
    std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);
    std::cout << "Текущее время: " << buffer << std::endl;
    
    return 0;
}

Основные функции <ctime>:

  • std::time() — возвращает текущее календарное время.
  • std::localtime() — преобразует time_t в структуру tm, представляющую местное время.
  • std::gmtime() — то же самое, но для UTC (всемирного координированного времени).
  • std::mktime() — обратное преобразование: из tm в time_t.
  • std::difftime() — вычисляет разницу в секундах между двумя моментами времени.
  • std::strftime() — форматирует дату и время в строку по заданному шаблону.

Недостатки: библиотека не учитывает часовые пояса (кроме локального и UTC), не поддерживает высокую точность (только секунды), а структура tm не является типобезопасной (например, год считается от 1900, месяц от 0 до 11).

2. Современный стандарт: библиотека <chrono> (C++11 и новее)

Начиная с C++11, в стандартную библиотеку была добавлена <chrono> — типобезопасная и высокоточная библиотека для работы с временем. Она оперирует тремя основными концепциями: длительность (duration), момент времени (time_point) и часы (clock).

Типы часов:

  • std::chrono::system_clock — системное время, привязанное к календарю (можно преобразовать в time_t).
  • std::chrono::steady_clock — монотонные часы, идеальны для измерения интервалов (не подвержены корректировкам).
  • std::chrono::high_resolution_clock — часы с максимально доступным разрешением (часто является синонимом steady_clock).

Пример 2: Измерение времени выполнения операции

#include <iostream>
#include <chrono>
#include <thread>

int main() {
    // Засекаем старт
    auto start = std::chrono::steady_clock::now();
    
    // Имитация работы
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
    
    // Засекаем финиш
    auto end = std::chrono::steady_clock::now();
    
    // Вычисляем разницу
    auto duration = end - start;
    
    // Выводим в разных единицах
    std::cout << "Прошло: "
              << std::chrono::duration_cast<std::chrono::milliseconds>(duration).count()
              << " мс" << std::endl;
    
    return 0;
}

Пример 3: Получение текущей даты и времени с помощью system_clock

#include <iostream>
#include <chrono>
#include <ctime>

int main() {
    // Получаем текущий момент времени
    auto now = std::chrono::system_clock::now();
    
    // Преобразуем в time_t для форматирования
    std::time_t now_time = std::chrono::system_clock::to_time_t(now);
    std::cout << "Текущее время: " << std::ctime(&now_time);
    
    return 0;
}

3. Новые возможности C++20: календарь и часовые пояса

Стандарт C++20 привнёс в <chrono> долгожданные возможности: работу с календарными датами (год, месяц, день), часовыми поясами и форматированием. Теперь можно писать код, который раньше был доступен только через сторонние библиотеки (например, Howard Hinnant's date).

Пример 4: Создание и вывод даты (C++20)

#include <iostream>
#include <chrono>
#include <format> // или <chrono> с поддержкой форматирования

int main() {
    using namespace std::chrono;
    
    // Создаём дату: 15 марта 2025 года
    auto date = year_month_day{year(2025), month(3), day(15)};
    
    // Выводим в стандартном формате
    std::cout << "Дата: " << date << std::endl;
    
    // Текущая дата
    auto today = floor<days>(system_clock::now());                

Блоги

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