Как конвертировать steady_clock::time_point в system_clock::time_point и наоборот?

Для конвертации между steady_clock::time_point и system_clock::time_point в C++, вам потребуется использовать классы std::chrono::time_point и функции преобразования, предоставляемые библиотекой <chrono>.

steady_clock и system_clock - это два разных типа часов, предоставляемых стандартной библиотекой <chrono>. steady_clock представляет собой монотонные часы, которые гарантируют фиксированную единицу измерения времени, в то время как system_clock представляет системные часы, которые зависят от системного времени и временной зоны.

Для конвертации steady_clock::time_point в system_clock::time_point, вам потребуется выполнить следующие шаги:

1. Получите текущее время steady_clock с помощью функции steady_clock::now():

std::chrono::steady_clock::time_point steady_time = std::chrono::steady_clock::now();

2. Создайте system_clock::duration, представляющую разницу между текущим временем steady_clock и начальным временем steady_clock (обычно это время начала программы):

std::chrono::steady_clock::duration steady_duration = steady_time - start_time; // start_time - время начала программы

3. Преобразуйте steady_duration в system_clock::duration с использованием функции std::chrono::duration_cast:

std::chrono::system_clock::duration system_duration = std::chrono::duration_cast<std::chrono::system_clock::duration>(steady_duration);

4. Создайте system_clock::time_point, добавив system_duration к начальному времени system_clock:

std::chrono::system_clock::time_point system_time = start_time + system_duration;

Теперь у вас есть время в system_clock::time_point, эквивалентное steady_clock::time_point.

Для конвертации из system_clock::time_point в steady_clock::time_point, вы можете выполнить обратные операции:

1. Получите текущее время system_clock с помощью функции system_clock::now():

std::chrono::system_clock::time_point system_time = std::chrono::system_clock::now();

2. Создайте system_clock::duration, представляющую разницу между текущим временем system_clock и начальным временем system_clock:

std::chrono::system_clock::duration system_duration = system_time - start_time; // start_time - время начала программы

3. Преобразуйте system_duration в steady_clock::duration с использованием функции std::chrono::duration_cast:

std::chrono::steady_clock::duration steady_duration = std::chrono::duration_cast<std::chrono::steady_clock::duration>(system_duration);

4. Создайте steady_clock::time_point, добавив steady_duration к начальному времени steady_clock:

std::chrono::steady_clock::time_point steady_time = start_time + steady_duration;

Теперь у вас есть время в steady_clock::time_point, эквивалентное system_clock::time_point.

Обратите внимание, что при конвертации между steady_clock и system_clock, возможно небольшое округление ошибка из-за различий в масштабах и точности этих типов часов.