Библиотека даты и времени
C++ включает поддержку двух типов манипуляций со временем:
- библиотека chrono — гибкая коллекция типов, отслеживающих время с различной точностью (например,
std::chrono::time_point). -
библиотека даты и времени в стиле C (например,
std::time).
Библиотека chrono (начиная с C++11)
Библиотека chrono определяет несколько основных типов, а также вспомогательные функции и распространённые псевдонимы типов:
| (начиная с C++20) |
Часы
Часы состоят из начальной точки (или эпохи) и частоты тиков. Например, эпохой часов может быть 1 января 1970 года, а тикать они могут каждую секунду. C++ определяет несколько типов часов:
Определено в заголовке <chrono> |
|
|---|---|
Определено в пространстве имён std::chrono |
|
|
(C++11) | системное время по часам реального времени, общим для всей системы (класс) |
|
(C++11) | монотонные часы, которые никогда не корректируются (класс) |
|
(C++11) | часы с наименьшим доступным периодом тика (класс) |
|
(C++20) | определяет, является ли тип часами (шаблон класса) (шаблон переменной) |
|
(C++20) |
Часы для всемирного координированного времени (UTC) (класс) |
|
(C++20) |
Часы для международного атомного времени (TAI) (класс) |
|
(C++20) |
Часы для времени GPS (класс) |
|
(C++20) |
Часы, используемые для времени файла (псевдоним типа) |
|
(C++20) | псевдочасы, представляющие местное время (класс) |
Момент времени
Момент времени — это длительность, прошедшая с эпохи определённых часов.
Определено в заголовке <chrono> |
|
|---|---|
Определено в пространстве имён std::chrono |
|
|
(C++11) | момент времени (шаблон класса) |
|
(C++20) | класс свойств, определяющий способ преобразования моментов времени одних часов в моменты времени других (шаблон класса) |
|
(C++20) | преобразует моменты времени одних часов в моменты времени других (шаблон функции) |
Длительность
Длительность — это промежуток времени, определённый некоторым количеством тиков некоторой единицы времени. Например, «42 секунды» могут быть представлены длительностью, состоящей из 42 тиков единицы времени в 1 секунду.
Определено в заголовке <chrono> |
|
|---|---|
Определено в пространстве имён std::chrono |
|
|
(C++11) | интервал времени (шаблон класса) |
Время суток (начиная с C++20)
hh_mm_ss разбивает длительность, представляющую время, прошедшее с полуночи, на часы, минуты, секунды и доли секунды, если применимо. В первую очередь это средство форматирования.
Определено в заголовке <chrono> |
|
|---|---|
Определено в пространстве имён std::chrono |
|
|
(C++20) | представляет время суток (шаблон класса) |
|
(C++20) | преобразует время суток между 12- и 24-часовым форматами (функция) |
Календарь (начиная с C++20)
Определено в заголовке <chrono> |
|
|---|---|
Определено в пространстве имён std::chrono |
|
|
(C++20) | класс-тег, обозначающий последний день или день недели в месяце (класс) (константа) |
|
(C++20) | представляет день месяца (класс) |
|
(C++20) | представляет месяц года (класс) |
|
(C++20) | представляет год григорианского календаря (класс) |
|
(C++20) | представляет день недели в григорианском календаре (класс) |
|
(C++20) | представляет n-й weekday месяца (класс) |
|
(C++20) | представляет последний weekday месяца (класс) |
|
(C++20) | представляет определённый day определённого month (класс) |
|
(C++20) | представляет последний день определённого month (класс) |
|
(C++20) | представляет n-й weekday определённого month (класс) |
|
(C++20) | представляет последний weekday определённого month (класс) |
|
(C++20) | представляет определённый month определённого year (класс) |
|
(C++20) | представляет определённые year, month и day (класс) |
|
(C++20) | представляет последний день определённых year и month (класс) |
|
(C++20) | представляет n-й weekday определённых year и month (класс) |
|
(C++20) | представляет последний weekday определённых year и month (класс) |
|
(C++20) | общепринятый синтаксис создания даты григорианского календаря (функция) |
Часовой пояс (начиная с C++20)
Определено в заголовке <chrono> |
|
|---|---|
Определено в пространстве имён std::chrono |
|
|
(C++20) | описывает копию базы данных часовых поясов IANA (класс) |
|
(C++20) | представляет связный список объектов tzdb (класс) |
|
(C++20) | получает доступ к глобальной базе данных часовых поясов и управляет ею (функция) |
|
(C++20) | находит time_zone по его названию (функция) |
|
(C++20) | возвращает текущий time_zone (функция) |
|
(C++20) | представляет часовой пояс (класс) |
|
(C++20) | представляет сведения о часовом поясе в определённый момент времени (класс) |
|
(C++20) | представляет сведения о преобразовании местного времени во время UNIX (класс) |
|
(C++20) | определяет способ разрешения неоднозначности местного времени (перечисление) |
|
(C++20) | класс свойств для указателей на часовые пояса, используемых в zoned_time (шаблон класса) |
|
(C++20) | представляет часовой пояс и момент времени (класс) |
|
(C++20) | содержит сведения о добавлении високосной секунды (класс) |
|
(C++20) | сведения о добавлении високосной секунды (класс) |
|
(C++20) | получает сведения о добавлении високосной секунды из объекта utc_time (шаблон функции) |
|
(C++20) | представляет альтернативное название часового пояса (класс) |
|
(C++20) | исключение, выбрасываемое для сообщения о несуществующем местном времени (класс) |
|
(C++20) | исключение, выбрасываемое для сообщения о неоднозначном местном времени (класс) |
Литералы (начиная с C++14)
Определено в заголовке <chrono> |
|
|---|---|
Определено во встроенном пространстве имён std::literals::chrono_literals |
|
|
(C++20) | литерал std::chrono::year, представляющий определённый год (функция) |
|
(C++20) | литерал std::chrono::day, представляющий день месяца (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий часы (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий минуты (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий секунды (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий миллисекунды (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий микросекунды (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий наносекунды (функция) |
Ввод-вывод chrono (начиная с C++20)
Определено в заголовке <chrono> |
|
|---|---|
Определено в пространстве имён std::chrono |
|
|
(C++20) | анализирует объект chrono из потока (шаблон функции) |
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_chrono | 201510L | (C++17) | Функции округления для std::chrono::duration и std::chrono::time_point |
201611L | (C++17) |
constexpr для всех нестатических функций-членов std::chrono::duration и std::chrono::time_point |
|
201907L | (C++20) | Календари и часовые пояса | |
202306L | (C++26) |
Поддержка хеширования для типов-значений std::chrono |
Библиотека даты и времени в стиле C
Также предоставляются функции даты и времени в стиле C, такие как std::time_t, std::difftime и CLOCKS_PER_SEC.
Пример
#include <chrono>
#include <iostream>
long Fibonacci(unsigned n)
{
return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2);
}
int main()
{
// Measures and displays an execution time of a function call.
const auto start{std::chrono::steady_clock::now()};
const auto fb{Fibonacci(42)};
const auto finish{std::chrono::steady_clock::now()};
const std::chrono::duration<double> elapsed_seconds{finish - start};
std::cout << "Fibonacci(42): " << fb << "\nElapsed time: ";
// std::cout << elapsed_seconds.count() << "s\n"; // Before C++20
std::cout << elapsed_seconds << '\n'; // C++20's chrono::duration operator<<
// Prints UTC and local time.
const auto tp_utc{std::chrono::system_clock::now()};
std::cout << "Current time 'UTC' is: " << tp_utc << "\n"
"Current time 'Local' is: "
<< std::chrono::current_zone()->to_local(tp_utc) << '\n';
}
Возможный вывод:
Fibonacci(42): 267914296 Elapsed time: 0.728532s Current time 'UTC' is: 2025-02-10 06:22:39.420666960 Current time 'Local' is: 2025-02-10 09:22:39.420666960
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/chrono