◐ Shell
clean mode source ↗

std::chrono::duration — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

Определено в заголовочном файле <chrono>

template< class Rep, class Period = std::ratio<1> > class duration;

(начиная с C++11)

Шаблонный класс std::chrono::duration представляет интервал времени.

Он состоит из счётчика тиков типа Rep и периода тика, где период тика представляет собой рациональное время компиляции fraction, представляющее время в секундах от одного тика к другому.

Единственные данные, хранящиеся в duration, это счётчик тиков типа Rep. Если Rep является числом с плавающей запятой, то duration может представлять доли тиков. Period включается как часть типа длительности и используется только при преобразовании между различными длительностями.

Типы элементы

Тип элементы Определение
rep Rep, арифметический тип, представляющий количество тиков
period Period (до C++17)typename Period::type (начиная с C++17), std::ratio, представляющий период тика (т.е. количество долей секунды в тике)

Функции-элементы

строит новый duration
(public функция-элемент) [править]
присваивает содержимое
(public функция-элемент) [править]
возвращает количество тиков
(public функция-элемент) [править]

[static]

возвращает специальное нулевое значение длительности
(public static функция-элемент) [править]

[static]

возвращает специальное минимальное значение длительности
(public static функция-элемент) [править]

[static]

возвращает специальное максимальное значение длительности
(public static функция-элемент) [править]
реализует унарный + и унарный -
(public функция-элемент) [править]
увеличивает или уменьшает количество тактов
(public функция-элемент) [править]
реализует составное присваивание между двумя длительностями
(public функция-элемент) [править]

Функции, не являющиеся элементами

реализует арифметические операции с duration в качестве аргументов
(шаблон функции) [править]

(C++11)(C++11)(удалено в C++20)(C++11)(C++11)(C++11)(C++11)(C++20)

сравнивает два duration
(шаблон функции) [править]
преобразует duration в другой duration с другим интервалом тиков
(шаблон функции) [править]
преобразует duration в другой, округляя в меньшую сторону
(шаблон функции) [править]
преобразует duration в другой, округляя в большую сторону
(шаблон функции) [править]
преобразует duration в другой, округляя до ближайшего, или до чётного в промежуточных случаях
(шаблон функции) [править]
получает абсолютное значение duration
(шаблон функции) [править]
выполняет потоковый вывод в duration
(шаблон функции) [править]
разбирает duration из потока в соответствии с предоставленным форматом
(шаблон функции) [править]

Вспомогательные типы

Тип /* intXX */, используемый в таблице ниже, означает целочисленный тип со знаком длиной не менее XX бит.

Тип Определение
std::chrono::nanoseconds std::chrono::duration</* int64 */, std::nano>
std::chrono::microseconds std::chrono::duration</* int55 */, std::micro>
std::chrono::milliseconds std::chrono::duration</* int45 */, std::milli>
std::chrono::seconds std::chrono::duration</* int35 */>
std::chrono::minutes std::chrono::duration</* int29 */, std::ratio<60>>
std::chrono::hours std::chrono::duration</* int23 */, std::ratio<3600>>
std::chrono::days (начиная с C++20) std::chrono::duration</* int25 */, std::ratio<86400>>
std::chrono::weeks (начиная с C++20) std::chrono::duration</* int22 */, std::ratio<604800>>
std::chrono::months (начиная с C++20) std::chrono::duration</* int20 */, std::ratio<2629746>>
std::chrono::years (начиная с C++20) std::chrono::duration</* int17 */, std::ratio<31556952>>

Примечание: каждый из предопределённых типов duration до hours охватывает диапазон не менее ±292 лет.

Каждый из предопределённых типов duration days, weeks, months и years охватывает диапазон не менее ±40000 лет. years равно 365.2425 days (средняя продолжительность григорианского года). months равен 30.436875 days (ровно 1/12 от years).

(начиная с C++20)

Вспомогательные классы

Литералы

Определены в пространстве имён std::literals::chrono_literals

Литерал std::chrono::duration, представляющий часы
(функция) [править]
Литерал std::chrono::duration, представляющий минуты
(функция) [править]
Литерал std::chrono::duration, представляющий секунды
(функция) [править]
Литерал std::chrono::duration, представляющий миллисекунды
(функция) [править]
Литерал std::chrono::duration, представляющий микросекунды
(функция) [править]
Литерал std::chrono::duration, представляющий наносекунды
(функция) [править]

Примечание: буквенные суффиксы d и y относятся не к days и years, а к day и year соответственно.

(начиная с C++20)

Примечание

Фактический интервал времени (в секундах), удерживаемый объектом duration d, примерно равен d.count() * D::period::num / D::period::den, где D имеет тип chrono::duration<>, а d объект этого типа.

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_lib_chrono_udls 201304L (C++14) Пользовательские литералы для типов времени

Пример

В этом примере показано, как определить несколько настраиваемых типов duration и выполнить преобразование между типами:

#include <iostream>
#include <chrono>
using namespace std::chrono_literals;

template<typename T1, typename T2>
using mul = std::ratio_multiply<T1, T2>;

int main()
{
    using microfortnights = std::chrono::duration<float,
        mul<mul<std::ratio<2>, std::chrono::weeks::period>, std::micro>>;
    using nanocenturies = std::chrono::duration<float,
        mul<mul<std::hecto, std::chrono::years::period>, std::nano>>;
    using fps_24 = std::chrono::duration<double, std::ratio<1,24>>;

    std::cout << "1 секунда это:\n";

    // преобразование целочисленного масштаба без потери точности: без приведения
    std::cout << std::chrono::milliseconds(1s).count() << " миллисекунд\n"
              << std::chrono::microseconds(1s).count() << " микросекунд\n"
              << std::chrono::nanoseconds(1s).count()  << " наносекунд\n";

    // преобразование целочисленного масштаба с потерей точности: требуется приведение
    std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
              << " минут\n";

    // преобразование масштаба с плавающей запятой: без приведения
    std::cout << microfortnights(1s).count() << " microfortnights\n"
              << nanocenturies(1s).count() << " нановека\n"
              << fps_24(1s).count() << " кадра в 24fps\n";
}

Вывод:

1 секунда это:
1000 миллисекунд
1000000 микросекунд
1000000000 наносекунд
0 минут
0.82672 microfortnights
0.316887 нановека
24 кадра в 24fps