У меня есть два ответа для вас:
Как это сделать в следующем году (в C ++ 20), который не реализован сегодня, и
Как вы можете сделать это сегодня с небольшими изменениями синтаксиса и сторонней библиотекой с открытым исходным кодом .
Первый 1:
#include <chrono>
#include <iostream>
#include <thread>
int
main()
{
using namespace std::chrono;
auto tp = system_clock::now();
while (true)
{
zoned_time zt{current_zone(), floor<milliseconds>(system_clock::now())};
cout << "Current time: " << std::format("{:%T}", zt) << '\n';
tp += 7s;
std::this_thread::sleep_until (tp);
}
}
Это создает местное время с использованием текущего часового пояса компьютера с точностью до миллисекунд.А затем просто распечатывает его в нужном формате (% T).Я использую sleep_until
вместо sleep_for
, чтобы каждая итерация цикла не отклонялась от желаемого интервала 7 с из-за издержек цикла.
Second 2:
Никтоимеет C ++ 20 хроно, но вы можете приблизить его сегодня с помощью бесплатной библиотеки дат / времени Говарда Хиннанта с открытым исходным кодом :
#include "date/tz.h"
#include <chrono>
#include <iostream>
#include <thread>
int
main()
{
using namespace date;
using namespace std::chrono;
auto tp = system_clock::now();
while (true)
{
zoned_time zt{current_zone(), floor<milliseconds>(system_clock::now())};
cout << "Current time: " << format("%T", zt) << '\n';
tp += 7s;
std::this_thread::sleep_until (tp);
}
}
Разница в том, что оператор format
немного отличается, и библиотека живет в namespace date
вместо namespace std::chrono
.И есть дополнительный заголовок для включения.И требуется некоторая установка для обработки часовых поясов .
Если вас устраивает отметка времени UTC вместо отметки местного времени, тогда вы можете использовать версию только для заголовкаиз той же библиотеки, как это (установка не требуется):
#include "date/date.h"
#include <iostream>
#include <thread>
int
main()
{
auto tp = std::chrono::system_clock::now();
while (true)
{
using namespace date;
using namespace std::chrono;
std::cout << "Current time: "
<< format("%T", floor<milliseconds>(system_clock::now())) << '\n';
tp += 7s;
std::this_thread::sleep_until (tp);
}
}