Работа с датами и временем: библиотека 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-корректности, применённым ко времени: пусть компилятор следит за тем, что иначе пришлось бы держать в голове.