Моменты времени
Представляйте моменты времени
«Моменты времени» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что такое временная точка
std::chrono::time_point представляет конкретный момент, измеренный относительно эпохи часов. Он связывает часы с интервалом времени, прошедшим с этой эпохи.
- Возвращается функцией
clock::now(). - Вычитание двух временных точек даёт интервал времени.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
time_point<steady_clock> tp = steady_clock::now();
std::cout << "Captured a moment: " << (tp.time_since_epoch().count() != 0) << '\n';
return 0;
}time_since_epoch
Каждая временная точка может сообщить расстояние от эпохи часов с помощью time_since_epoch(), возвращающего интервал времени.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
auto d = tp.time_since_epoch();
auto s = duration_cast<seconds>(d);
std::cout << "Positive epoch seconds: " << (s.count() > 0) << '\n';
return 0;
}Вычитание временных точек
Вычитание одной временной точки из другой даёт интервал времени, то есть время, прошедшее между двумя моментами.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto a = steady_clock::now();
auto b = steady_clock::now();
auto diff = b - a;
std::cout << "Elapsed ns is non-negative: " << (diff.count() >= 0) << '\n';
return 0;
}Добавление интервала времени
Добавление интервала времени к временной точке создаёт новую временную точку в будущем или в прошлом при вычитании. Так вычисляются крайние сроки.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
using namespace std::chrono_literals;
auto now = steady_clock::now();
auto deadline = now + 10s;
std::cout << "Deadline is after now: " << std::boolalpha << (deadline > now) << '\n';
return 0;
}Сравнение временных точек
Временные точки одних и тех же часов поддерживают все операторы сравнения, позволяя проверить, наступил ли один момент раньше или позже другого.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto first = steady_clock::now();
auto second = steady_clock::now();
std::cout << std::boolalpha << (first <= second) << '\n';
return 0;
}Временные точки конкретных часов
Временная точка связана с типом своих часов. Вы не можете напрямую сравнить временную точку system_clock с временной точкой steady_clock, поскольку их эпохи различаются.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
system_clock::time_point sys = system_clock::now();
steady_clock::time_point mono = steady_clock::now();
std::cout << "Both captured: " << ((sys.time_since_epoch().count() != 0) && (mono.time_since_epoch().count() != 0)) << '\n';
return 0;
}Преобразование в time_t
system_clock::to_time_t преобразует календарную временную точку в time_t в стиле C, который можно отформатировать для отображения пользователю.
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
std::time_t t = system_clock::to_time_t(tp);
std::cout << "time_t is positive: " << (t > 0) << '\n';
return 0;
}from_time_t
Обратная функция, system_clock::from_time_t, создаёт временную точку из значения time_t, например сохранённой временной метки.
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
using namespace std::chrono;
std::time_t t = 1000000000;
auto tp = system_clock::from_time_t(t);
auto back = system_clock::to_time_t(tp);
std::cout << "Round trip ok: " << std::boolalpha << (back == t) << '\n';
return 0;
}Вычисление крайнего срока
Распространённый шаблон: сохраните now(), добавьте интервал timeout, а затем сравните его с новым значением now(), чтобы проверить, истёк ли крайний срок.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
using namespace std::chrono_literals;
auto deadline = steady_clock::now() + 0ms;
auto current = steady_clock::now();
bool expired = current >= deadline;
std::cout << "Expired: " << std::boolalpha << expired << '\n';
return 0;
}Точность временной точки
Точность временной точки совпадает с типом интервала времени её часов. Временную точку можно преобразовать в более крупную единицу с помощью time_point_cast.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
auto secs_tp = time_point_cast<seconds>(tp);
std::cout << "Cast preserved sign: " << (secs_tp.time_since_epoch().count() > 0) << '\n';
return 0;
}Сохранение временных меток
Чтобы сохранить момент времени, преобразуйте его в количество секунд с начала эпохи, сохраните целое число, а позже при необходимости восстановите временную точку.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
long long stored = duration_cast<seconds>(tp.time_since_epoch()).count();
std::cout << "Stored value usable: " << (stored > 0) << '\n';
return 0;
}Быстрая проверка
Проверьте понимание арифметики временных точек.
Итоги
Вы узнали, что time_point:
- отмечает конкретный момент относительно эпохи часов
- сообщает своё смещение с помощью
time_since_epoch() - поддерживает сложение и вычитание интервалов времени, а также сравнение
- преобразуется в
time_tи обратно для отображения и хранения
Далее Вы примените эти инструменты для сравнения производительности и измерения быстродействия кода.
Часто задаваемые вопросы
Урок «Моменты времени» бесплатный?
Да — полный текст урока «Моменты времени» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Моменты времени»?
Представляйте моменты времени Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Моменты времени»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.