4

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

“64 位”时间戳示例:129518309081725000 129518309082059000 129518309082393000 129518309082727000 129518309083060000 129518309083394087201

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

非常感谢任何帮助,

史蒂夫

4

2 回答 2

5

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

于 2011-06-06T19:59:13.993 回答
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

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

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 位时间戳。

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

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'
于 2012-11-01T16:28:26.210 回答