Отображение обновленного времени ntp в java

В настоящее время я пишу клиент и сервер NTP на Java. Я рассчитываю смещение и задержку туда и обратно, используя временные метки NTP. Я должен отметить, что я вычисляю их для секунд (первые 32 бита) и дробей (вторые 32 бита) отдельно. Я получаю результаты смещения, такие как 0 секунд и 1859395165 дробей.

Мой вопрос: как я могу использовать эти смещения, чтобы распечатать, каким было бы мое системное время, если бы оно было скорректировано в соответствии с заданным смещением?

Я думал, что могу просто добавить дроби к дробной части временной метки для текущего времени моей системы, но если сумма дробей будет больше 1 секунды, я полагаю, что у меня возникнут проблемы, поскольку мои секунды будут тогда неверны.


person toffoo    schedule 01.04.2015    source источник
comment
К сведению: stackoverflow.com/questions/925191/java-ntp-client   -  person assylias    schedule 01.04.2015
comment
Я не совсем понимаю, какую проблему вы пытаетесь решить, но похоже, что вы беспокоитесь о целочисленных переполнениях? Почему бы просто не поместить секунды и дробь в длинное (длинное = (((длинные) секунды) ‹‹ 32) | (доля и 0xFFFFFFFFFL)), вычислить разницу, а затем снова разделить их?   -  person Durandal    schedule 01.04.2015
comment
Спасибо за ваш ответ. Я просто пытаюсь напечатать, каким должно быть мое системное время, когда было применено смещение.   -  person toffoo    schedule 01.04.2015


Ответы (1)


Вы можете сначала преобразовать дробь в миллисекунды, а затем выполнить вычисления. Затем, скажем, вы получаете время 11:05:21:900 с сервера, а смещение составляет 200 мс. Затем вы просто добавляете это к 11:05:21:900 и получаете 11:05:22:100.

Вам просто нужна функция, которая проверяет, попали ли вы в новую секунду/минуту/и т. д. после добавления смещения. Начало этого кода может выглядеть так.

systemMs += offsetMs;
if (systemMs >= 1000)
{
    systemS += 1;
    systemMS -= 1000;
    if (systemS >= 60)
    {
        etc
    }
}
person Jesper Evertsson    schedule 07.05.2015