c ++ chrono Clock в формате ЧЧ: ММ: СС, когда оно должно быть в секундах. Миллисекунды - PullRequest
0 голосов
/ 27 сентября 2019

Итак, сейчас я использую код

using std::chrono::system_clock;
std::time_t tt = system_clock::to_time_t (system_clock::now());
struct std::tm * ptm = std::localtime(&tt);
std::cout << "Current time: " << std::put_time(ptm,"%X") << '\n';
std::this_thread::sleep_for (std::chrono::seconds(7));

Это просто, потому что это в цикле, и chrono sleep_for задерживает систему на сколько секунд.Проблема в том, что в формате ЧЧ: ММ: СС мне действительно нужны секунды. Миллисекунды, чтобы показать время транзакции системных часов.Как бы я это сделал?Мне действительно просто нужен кто-то, чтобы объяснить код, почему он создает структуру?И что я должен сделать, чтобы изменить формат?Спасибо!

1 Ответ

3 голосов
/ 27 сентября 2019

У меня есть два ответа для вас:

  1. Как это сделать в следующем году (в C ++ 20), который не реализован сегодня, и

  2. Как вы можете сделать это сегодня с небольшими изменениями синтаксиса и сторонней библиотекой с открытым исходным кодом .

Первый 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);
    }
}
...