Мне нужно взять текущее местное время, включая миллисекунды, и передать его на какое-то встроенное устройство. Это устройство теперь имеет представление о календарном времени, но имеет собственный таймер с точностью до 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.