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

Ste*_*ley 4 64-bit datetime timestamp ntp

在我的数据集中,我有两个时间戳列.第一个是自应用程序启动以来的微秒 - 例如,1400805323.第二个被描述为64位时间戳,我希望它将指示时钟时间,使用从1/1/1901开始的NTP格式.

'64位'时间戳示例:129518309081725000 129518309082059000 129518309082393000 129518309082727000 129518309083060000 129518309083394000 129518309083727000

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

任何帮助非常感谢,

史蒂夫

Rom*_*Rom 5

假设这些值是在今天(2011年6月6日)生成的,这些值看起来像自1601年1月1日以来的100纳秒间隔的数量.这就是Windows NT存储FILETIME的方式.有关更多信息集中的这个阅读雷蒙德陈的这个博客帖子.这些文章还展示了如何将其转换为其他任何东西


Den*_*nis 5

请参阅下面的编辑以获取更新的答案:
对于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
Run Code Online (Sandbox Code Playgroud)

时间模块可以将浮动转换为可读的时间格式.

import time
time.ctime(to_seconds(ntp_timestamp))
Run Code Online (Sandbox Code Playgroud)

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

>>> time.ctime(to_seconds(129518309081725000))
'Tue Dec 15 17:37:11 1970'
Run Code Online (Sandbox Code Playgroud)

编辑:PyGuy是对的,原始时间戳不是ntp时间数字,它们是Windows 64位时间戳.

以下是将基于1/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
Run Code Online (Sandbox Code Playgroud)

而新的输出:

import time
time.ctime(to_seconds(129518309081725000))
'Mon Jun  6 04:48:28 2011'
Run Code Online (Sandbox Code Playgroud)