См. редактирование ниже для обновленного ответа:
Для времени 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 относится к 1 января 1970 года. Поэтому, если ваша программа основывается на форматах времени ntp с момента запуска программы, вам нужно добавить секунды, чтобы нормализовать метку времени для ctime.
>>> time.ctime(to_seconds(129518309081725000))
'Tue Dec 15 17:37:11 1970'
РЕДАКТИРОВАТЬ: PyGuy прав, исходные временные метки не являются номерами времени ntp, это 64-битные временные метки Windows.
Вот новый метод to_seconds для преобразования интервала 100 нс, основанного на 01.01.1601, в интервал 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'
person
Dennis
schedule
01.11.2012