0Pricing
C++ Academy · Урок

Моменты времени

Представляйте моменты времени

«Моменты времени» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Длительности и часы
  2. Моменты времени
  3. Измерение производительности кода
  4. Календарь и часовые пояса
← Назад к C++ Academy