代码之家  ›  专栏  ›  技术社区  ›  Alex F

以毫秒精度对日期和时间的操作

  •  0
  • Alex F  · 技术社区  · 7 年前

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

    我会这样做:

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

    然后将epoch之后的毫秒数传递给设备,在设备中可以将其记录为 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);