Spec-Zone.ru › C++

std::chrono::duration

Определено в заголовочном файле <chrono>
template<
    class Rep,
    class Period = std::ratio<1>
> class duration;
(с C++11)

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

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

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

Типы членов

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

Члены-функции

(конструктор)
создаёт новый интервал времени
(публичная функция-член)
operator=
присваивает содержимое
(публичная функция-член)
count
возвращает количество тиков
(публичная функция-член)
zero
[статический]
возвращает специальное значение нулевого интервала времени
(публичная статическая функция-член)
min
[статический]
возвращает специальное значение минимального интервала времени
(публичная статическая функция-член)
max
[статический]
возвращает специальное значение максимального интервала времени
(публичная статическая функция-член)
operator+operator-
реализует унарные + и -
(публичная функция-член)
operator++operator++(int)operator--operator--(int)
увеличивает или уменьшает количество тиков
(публичная функция-член)
operator+=operator-=operator*=operator/=operator%=
реализует сложные операции присваивания между двумя интервалами времени
(публичная функция-член)

Внешние функции

operator+operator-operator*operator/operator%
(C++11)
реализует арифметические операции с интервалами времени в качестве аргументов
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++11)(C++11)(удалено в C++20)(C++11)(C++11)(C++11)(C++11)(C++20)
сравнивает два интервала времени
(шаблон функции)
duration_cast
(C++11)
преобразует интервал времени в другой с другим периодом тика
(шаблон функции)
floor(std::chrono::duration)
(C++17)
преобразует интервал времени в другой, округляя вниз
(шаблон функции)
ceil(std::chrono::duration)
(C++17)
преобразует интервал времени в другой, округляя вверх
(шаблон функции)
round(std::chrono::duration)
(C++17)
преобразует интервал времени в другой, округляя до ближайшего целого, при равенстве округляет до чётного
(шаблон функции)
abs(std::chrono::duration)
(C++17)
возвращает абсолютное значение интервала времени
(шаблон функции)
operator<<
(C++20)
выполняет вывод в поток для duration
(шаблон функции)
from_stream
(C++20)
парсит интервал времени из потока в соответствии с заданным форматом
(шаблон функции)

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

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

END_OF_DOCUMENT_MARKER
Тип Определение
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>>

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

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

(с C++20)

Классы-помощники

std::common_type<std::chrono::duration>
(C++11)
специализирует std::common_type предикат
(специализация шаблона класса)
treat_as_floating_point
(C++11)
указывает, что продолжительность может быть преобразована в продолжительность с другим периодом отсчета
(шаблон класса)
duration_values
(C++11)
создаёт нулевое, минимальное и максимальное значения счётчика отсчётов заданного типа
(шаблон класса)
std::formatter<std::chrono::duration>
(C++20)
поддержка форматирования для duration
(специализация шаблона класса)
std::hash<std::chrono::duration>
(C++26)
поддержка хеширования для std::chrono::duration
(специализация шаблона класса)

Литералы

Определено в встроенном именованном пространстве std::literals::chrono_literals
operator""h
(C++14)
литерал, представляющий часы
(функция)
operator""min
(C++14)
литерал, представляющий минуты
(функция)
operator""s
(C++14)
литерал, представляющий секунды
(функция)
operator""ms
(C++14)
литерал, представляющий миллисекунды
(функция)
operator""us
(C++14)
литерал, представляющий микросекунды
(функция)
operator""ns
(C++14)
литерал, представляющий наносекунды
(функция)

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

(с C++20)

Примечания

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

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

Пример

Этот пример демонстрирует, как определить несколько типов пользовательской длительности и конвертировать между ними:

#include <chrono>
#include <iostream>
 
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 second is:\n";
 
    // integer scale conversion with no precision loss: no cast
    std::cout << std::chrono::milliseconds(1s).count() << " milliseconds\n"
              << std::chrono::microseconds(1s).count() << " microseconds\n"
              << std::chrono::nanoseconds(1s).count() << " nanoseconds\n";
 
    // integer scale conversion with precision loss: requires a cast
    std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
              << " minutes\n";
 
    // floating-point scale conversion: no cast
    std::cout << microfortnights(1s).count() << " microfortnights\n"
              << nanocenturies(1s).count() << " nanocenturies\n"
              << fps_24(1s).count() << " frames at 24fps\n";
}

Вывод:

1 second is:
1000 milliseconds
1000000 microseconds
1000000000 nanoseconds
0 minutes
0.82672 microfortnights
0.316887 nanocenturies
24 frames at 24fps

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/chrono/duration

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API