我需要占用当前的本地时间,包括毫秒,并将其传递给一些嵌入式设备。这个设备现在有日历时间的概念,但是它有自己的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。