在我的数据集中,我有两个时间戳列。第一个是应用程序启动后的微秒,例如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'