В других учебниках и книгах при преобразовании промежутков времени вы могли столкнуться с duration_cast
chrono::milliseconds
и нужно преобразовать его к типу chrono::hours
, например, то следует написать конструкцию duration_cast(milliseconds_value)
, поскольку данные единицы измерения зависят от целочисленных типов. Преобразование точных единиц времени в менее точные приводит к потере точности, именно поэтому и нужен duration_cast
. Для продолжительностей, основанных на типах double
или float
, этого не требуется.Выполняем преобразование между абсолютными и относительными значениями с использованием std::chrono
До C++11 было довольно сложно получить физическое время и
Начиная с C++11, в STL можно найти библиотеку chrono
В этом примере мы возьмем местное время, выведем его на экран и поработаем с ним, добавляя разные смещения, что очень удобно делать с помощью библиотеки std::chrono
Как это делается
В примере мы сохраним текущее время и выведем его на экран. Кроме того, наша программа будет добавлять разные смещения к сохраненному времени и выводить на экран полученные результаты.
1. Сначала идут типичные директивы include
std
:#include
#include
#include
using namespace std;
2. Выведем на экран абсолютные моменты времени. Они будут иметь форму шаблона типа chrono::time_point
%c
. Можно было бы, конечно, также вывести только время, только дату, только год или что-то еще, приходящее на ум. Все преобразования между разными типами до того, как мы сможем использовать put_time
, будут выглядеть несколько «неаккуратно», но мы провернем это лишь однажды.ostream& operator<<(ostream &os,
const chrono::time_point
{
const auto tt (chrono::system_clock::to_time_t(t));
const auto loct (std::localtime(&tt));
return os << put_time(loct, "%c");
}
3. Для секунд, минут, часов и т.д. в STL существуют описания типов. Сейчас мы добавим тип days
chrono::duration
, сославшись на часы и умножив их на 24, поскольку сутки насчитывают 24 часа.using days = chrono::duration<
chrono::hours::rep,
ratio_multiply
4. Чтобы наиболее элегантным способом выразить продолжительность длиной в несколько дней, можно определить собственный пользовательский литерал days
3_days
, чтобы создать значение, которое представляет собой три дня.constexpr days operator ""_days(unsigned long long h)
{
return days{h};
}
5. В самой программе сделаем снимок момента времени, который затем просто выведем на экран. Это очень легко и удобно, поскольку мы уже реализовали правильную версию перегруженного оператора.
int main()
{
auto now (chrono::system_clock::now());
cout << "The current date and time is " << now << '\n';
6. Сохранив текущее время в переменной now
chrono::hours chrono_12h {12};
cout << "In 12 hours, it will be "
<< (now + chrono_12h)<< '\n';
7. Объявляя об использовании по умолчанию пространства имен chrono_literals
using namespace chrono_literals;
cout << "12 hours and 15 minutes ago, it was "
<< (now - 12h - 15min) << '\n'
<< "1 week ago, it was "