将64位时间戳转换为可读值



在我的数据集中,我有两个时间戳列。第一个是应用程序启动后的微秒,例如1400805323。第二个被描述为64位时间戳,我希望它能指示时钟时间,使用从1901年1月1日起的秒数NTP格式。

"64位"时间戳示例:129518309081725000129518309082059000129518309082393000129518309082727000129518309083060000129518309083394000129518309083277000

有没有任何matlab/python代码可以将其转换为可读格式?

非常感谢您的帮助,

Steve

假设这些值是在今天,2011年6月6日生成的,那么这些值看起来像是自1601年1月1日以来的100纳秒间隔。这就是Windows NT存储FILETIME的方式。欲了解更多关于这方面的信息,请阅读陈的博客文章。这些文章还展示了如何将其转换为其他任何东西

请参阅下面的编辑以获取更新的答案:
对于NTP时间,64位分为秒和几分之一秒。前32位是秒。最下面的32位是秒的分数。通过将分数部分除以2^32得到分数。

因此,第一步,转换为替身。

如果你喜欢python,那就足够简单了,我没有添加任何边界检查:

def to_seconds(h):
   return (h>>32) + ((float)(h&0xffffffff))/pow(2,32)
>>> to_seconds(129518309081725000)
30155831.26845886

时间模块可以将浮点转换为可读的时间格式。

import time
time.ctime(to_seconds(ntp_timestamp))

不过,您需要担心时间戳的来源。time.ctime假定与1970年1月1日有关。因此,如果您的程序基于程序运行后的ntp时间格式,则需要添加秒来规范ctime的时间戳。

>>> time.ctime(to_seconds(129518309081725000))
'Tue Dec 15 17:37:11 1970'

编辑:PyGuy是对的,最初的时间戳不是ntp时间数字,它们是Windows 64位时间戳。

以下是将基于1/1601的100ns间隔转换为1970秒间隔的新to_seconds方法:

def to_seconds(h):
    s=float(h)/1e7 # convert to seconds
    return s-11644473600 # number of seconds from 1601 to 1970

以及新的输出:

import time
time.ctime(to_seconds(129518309081725000))
'Mon Jun  6 04:48:28 2011'

相关内容

  • 没有找到相关文章

最新更新