【问题标题】:Can anyone tell me how can I relate timegettime time with epochtime谁能告诉我如何将 timegettime 时间与 epochtime 联系起来
【发布时间】:2017-11-10 20:05:53
【问题描述】:

我正在开展一个项目,我们正在从各种传感器收集数据并记录各种日志。

大多数传感器都使用TimeGetTime 以毫秒为单位记录,这是从 PC 启动时间开始测量的时间。但是我有一个传感器,它的数据记录在纪元时间,以毫秒为单位。

如果我必须将所有传感器数据同步在一起,现在如何将纪元时间与TimeGetTime 关联起来?

【问题讨论】:

    标签: windows time


    【解决方案1】:

    将纪元时间(我假设它是自 [Wikipedia]: Unix time([MAN]: time)* 1000 以来经过的毫秒数 (ms))转换为 ms 的一种方法Win 启动后已过去,您必须:

    1. 获取自 Win 启动以来的 ms 数,使用(如您已经提到的)[MSDN]: timeGetTime function(作为替代,您可以使用 [MSDN]: GetTickCount64 function;我没有t 研究 2) 之间的差异(就精度而言)
    2. 获取当前Win时间,使用[MSDN]: GetSystemTimeAsFileTime function
    3. 由于上一步检索到的时间是(根据[MSDN]: FILETIME structure):

      一个 64 位值,表示自 1601 年 1 月 1 日 (UTC) 以来的 100 纳秒间隔数。

      您需要将其转换为 Ux 纪元样式时间。转换算法非常简单,网上有很多例子,这里有一个:[SO]: Convert Windows Filetime to second in Unix/Linux(因为结果以秒为单位,你需要将它乘以 1000)。这表示从 Ux 纪元时间到现在所经过的 ms

    4. 通过从 Step 3 中的值减去 Step 1 中的值(ms,因为 Win 开始) (msUx 纪元时间),您将获得 Ux 纪元时间与Win 开始的时间。这是您必须从 funky 传感器获得的每个时间戳中减去的偏移量,以便与从所有其他传感器获得的时间戳保持同步。

    【讨论】:

    • 非常感谢您的回复。是的,我正在尝试同时调用 _ftime64_s( &timebuffer );无符号长 lwTime = timeGetTime();在关键部分下,如果函数的执行存在差异,则差异不会超过 1-2 毫秒,然后会尝试以可能 20 分钟的频繁间隔查看两个结果之间的差异。
    • 不客气 :)。这就是为什么我命令步骤 #1#2 是连续的,因此完成的任何处理都不会影响结果。您可以通过在 #2#3 之间添加(复制)#1 来对其进行性能测试,因此它将是 #2.5 如果你愿意的话。通过从 #2.5 中减去 #1,您会看到两次调用之间的时间差(以 ms 为单位),但我怀疑它是否值得注意(除非机器(CPU)被其他进程重载)。只要应用程序不涉及线程,我不确定您是否需要关键部分。
    猜你喜欢
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多