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

Типы-члены

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

Функции-члены

(конструктор)
создаёт новую длительность
(открытая функция-член)
operator=
присваивает содержимое
(открытая функция-член)
count
возвращает количество тактов
(открытая функция-член)
zero
[static]
возвращает специальное значение длительности — ноль
(открытая статическая функция-член)
min
[static]
возвращает специальное минимальное значение длительности
(открытая статическая функция-член)
max
[static]
возвращает специальное максимальное значение длительности
(открытая статическая функция-член)
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)
разбирает 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>>

Примечание: каждый из предопределённых типов длительности вплоть до 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
(специализация шаблона класса)

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

template< class Rep, class Period >
constexpr bool enable_nonlocking_formatter_optimization<chrono::duration<Rep, Period>> 
    = enable_nonlocking_formatter_optimization<Rep>;
(начиная с C++23)

Эта специализация std::enable_nonlocking_formatter_optimization обеспечивает эффективную реализацию std::print и std::println для вывода объекта chrono::duration, если параметр шаблона Rep включает такую возможность.

Литералы

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

Примечание: суффиксы литералов 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";
    // alternative to duration_cast:
    std::cout << 1s / 1min << " 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 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/cpp/chrono/duration

Spec-Zone.ru

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