Работа со временем как с безразмерной величиной может приводить к недоразумениям и ошибкам конвертации временных единиц измерения: Для избежания таких ошибок предусмотрена библиотека chrono (namespace std::chrono). Она была добавлена в C++11 и дорабатывалась в поздних стандартах. Теперь все логично: Библиотека реализует следующие концепции: std::ratio – шаблонный класс, реализующий compile-time обыкновенную дробь (m/n). Он не относится к chrono, но активно используется этой библиотекой, поэтому, в первую очередь, познакомимся с ним, чтобы далее не вызывал вопросов. Важно, что числитель и знаменатель – шаблонные constexpr параметры. Это позволяет формировать тип на этапе компиляции. Этот класс вспомогательный (чисто статический, helper class), и вообще говоря, не предназначен для математических вычислений. Он нужен для эффективного перевода единиц измерений. Например, мы хотим работать с различными единицами расстояний: Пусть миллиметр будет базовой единицей, тогда: В конструкторе можно было производить преобразование к базовой единице. Но, правильнее только там, где это преобразование нужно. Потому что метры в миллиметры можно преобразовать не опасаясь потерь при округлении, чего нельзя сказать об обратном. В связи с вышесказанным, только лишь для полноты примера, я привожу не самую удачную реализацию операции сложения, зато простую: Правильно было бы получать метры при сложении метров и километров. Шаблонный класс std::chrono::duration является типом интервала времени. Интервал времени в chrono — это некоторое количество периодов (в оригинале tick period). Это количество характеризуется типом, например int64_t или float. Продолжительность периода измеряется в секундах и представляется в виде натуральной дроби с помощью std::ratio. Некоторые популярные интервалы уже определены в библиотеке. Типы могут немного различаться в различных реализациях Но можно определить свои: Теперь как с ними работать. Неявная инициализация запрещена: Только явная: Кстати, почему используются фигурные скобки можете почитать, например, здесь. Вкратце: для избежания неявного преобразования интегральных типов с потерями. Добавлю еще случай, когда T x(F()); вместо инициализации x, трактуется как объявление функции, принимающей указатель на функцию типа F(*)() и возвращающей T. Решение: T x{F()}; или T x((F()));. В C++14 добавлены пользовательские литералы для основных единиц: Можно складывать, вычитать и сравнивать: Как в примере выше, можно неявно преобразовывать часы в минуты, минуты в секунды, секунды в миллисекуну и т. д., но не наоборот: В общем случае, неявное преобразование для целочисленных типов разрешено если отношение периодов является целым числом: В противном случае есть 2 способа: округление и преобразование к float-типу. Второй вариант: Допустим, для вас избыточно представление количества секунд типом uint64_t. Ок: Но вы все равно опасаетесь переполнения. Можно использовать класс из библиотеки для безопасной работы с числами. В стандарте такой нет (только предложение), но есть сторонние реализации. Также есть в VS, ее и используем: Чтобы вывести значение интервала на экран или в файл, нужно использовать count(): Но не используйте count для внутренних преобразований! Класс time_point предназначен для представления моментов времени. Момент времени может быть охарактеризован как интервал времени, измеренным на каком-либо таймере, начиная с некоторой точки отсчета. Например, если вы готовите суп, пользуясь секундомером, то ваши моменты времени могут быть представлены так: А если по минутной стрелке настенных часов, то те же моменты времени могут быть такими: Итак, сам класс: Тип интервала времени нам уже знаком, теперь перейдем к таймеру Clock. В библиотеке 3 таймера: У Clock есть статическая переменная is_steady, по который вы можете узнать, является ли таймер монотонным. Также у Clock есть функция now, возвращающая текущий момент времени в виде time_point. Сам по себе объект класса time_point не очень интересен, так как момент его начала отсчета не специфирован и имеет мало смысла. Но к нему можно прибавлять интервалы времени и сравнивать с другими моментами времени: time_point нельзя сложить с time_point, зато можно вычесть, что полезно для засечения времени: Чтобы получить интервал времени, прошедший с момента начала отсчета, можно вызвать time_since_epoch: Преобразование time_point в число, например для сериализации или вывода на экран, можно осуществить через С-тип time_t: Самый частый вопрос: как вывести время и дату в читаемом виде. С помощью chrono никак. Можно поиграть с time_t или использовать другую библиотеку от разработчика chrono.