Перейти к содержанию

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

Начало урока

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

Типобезопасные длительности, часы и моменты времени для измерения и планирования

Главная идея: Время - это не просто число. Обычный int со значением "500" ничего не говорит о том, 500 это секунд, миллисекунд или наносекунд, а смешение этих единиц - классический источник незаметных ошибок. Библиотека <chrono> кодирует единицу измерения в самом типе. Тип std::chrono::milliseconds отличается от std::chrono::seconds, поэтому компилятор сам преобразует их и отказывается от преобразований, которые тихо теряют точность.
К концу вы сможете:
  • объяснить три основных абстракции: длительности, часы и моменты времени,
  • выбрать правильные часы для измерения прошедшего времени и для чтения календарной даты,
  • безопасно преобразовывать единицы с помощью duration_cast и понимать, когда происходит усечение,
  • замерять собственный код и построить небольшой секундомер и обратный отсчёт.

1. Почему измерять время обманчиво сложно

До <chrono> код замеряли C-функциями вроде time() или clock(), сохраняя результат в голом long. У такого подхода три ловушки:

  • Путаница с единицами: у числа вроде 1500 нет прикреплённой единицы. Функция, возвращающая его, отдаёт секунды или миллисекунды? Тип этого не сообщает, поэтому неверное предположение спокойно компилируется и даёт ошибку в 1000 раз.
  • Неправильные часы: обычные "настенные" часы (календарное время компьютера) могут прыгать. Когда машина синхронизируется с сервером времени, или пользователь меняет дату, или происходит переход на летнее время, настенные часы могут сдвинуться назад. Если вы замеряли ими задачу, вы получите отрицательную или абсурдную длительность.
  • Тихое переполнение и потеря точности: преобразование секунд в наносекунды умножением на миллиард может переполнить 32-битное целое, а обратное деление молча отбрасывает дробную часть.

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

Продолжите этот урок на YourAIZone

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

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя