Операции с датой и временем с точностью до миллисекунд - PullRequest
0 голосов
/ 24 июня 2018

Мне нужно взять текущее местное время, включая миллисекунды, и передать его на какое-то встроенное устройство. Это устройство теперь имеет представление о календарном времени, но имеет собственный таймер с точностью до 1 мс. Таким образом, когда это устройство получает текущую метку времени, оно открывает файл журнала и записывает эту метку времени в начало. С этого момента он записывает в журнал различные сообщения, каждое из которых имеет количество миллисекунд, прошедших с этого начального времени. Наконец, файл журнала встроенного устройства загружается на хост и должен быть проанализирован со всеми относительными временными интервалами, преобразованными обратно в полное календарное время. Первая часть в программе хоста выглядит так:

struct timestamp
{
    int year;    // 0-based 
    int month;   // [1-12]
    int day;     // [1-31]
    int hour;    // [0-23]
    int minute;  // [0-59]
    int sec;     // [0-59]
    int ms;      // [0-999]
};

timestamp time_point_to_timestamp(std::chrono::time_point<std::chrono::system_clock> tp)
{
    auto seconds = std::chrono::time_point_cast<std::chrono::seconds>(tp);
    auto fraction = tp - seconds;
    auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(fraction);
    time_t tt = std::chrono::system_clock::to_time_t(tp);
    tm* ptm = localtime(&tt);

    timestamp t;
    t.year = ptm->tm_year + 1900;
    t.month = ptm->tm_mon + 1;
    t.day = ptm->tm_mday;
    t.hour = ptm->tm_hour;
    t.minute = ptm->tm_min;
    t.sec = ptm->tm_sec;
    t.ms = static_cast<int>(milliseconds.count());
    return t;
}

void start()
{
     timestamp ts = time_point_to_timestamp(std::chrono::system_clock::now());
     // send ts to embedded device
     // ...
}

Теперь, когда я возвращаю журнал с устройства обратно на хост, он выглядит так:

2018 6 24 8 25 52 598     // start time ts
500 message 1             // ms elapsed from ts
2350 message 2            // ms elapsed from ts
...

Мне нужно проанализировать этот файл и преобразовать каждое сообщение, печатая его полную дату и время. Например, 500 будет преобразовано в:

2018 6 24 8 25 53 098

Итак, мне нужен какой-то способ конвертации timestamp в любой тип C ++, который позволяет добавить к нему временные интервалы (time_point, duration?) И распечатать его в удобочитаемой для человека форме. Мой компилятор поддерживает C ++ 14.

1 Ответ

0 голосов
/ 24 июня 2018

Я бы сделал это:

int64_t to_epoch_ms(time_point<system_clock> tp)
{
    return duration_cast<milliseconds>(tp.time_since_epoch()).count();
}

Затем передайте миллисекунды с эпохи на устройство, где оно может быть зарегистрировано, например, как. 1529819166927. Добавление миллисекунд является тривиальным и быстрым, независимо от того, делаете ли вы это напрямую, используя int64_t или преобразовывая обратно в time_point:

time_point<system_clock> from_epoch_ms(int64_t ms)
{
    return {milliseconds(ms)};
}

auto tp1 = from_epoch_ms(ms + 123);
auto tp1 = from_epoch_ms(ms) + milliseconds(456);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...