Получение времени с сервера ntp, не позволяя пользователю манипулировать временем - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь получить время с NTP-сервера.У меня есть метод, который запрашивает время у нескольких серверов (если первый дает результат, другой не будет задан вопрос о резервном копировании).Чтобы определить дату из InetAddress, я использую TimeInfo из библиотеки: commons-net: commons-net: 3.0.1.Это решило время так, как должно, но стало проблемой, когда я вручную изменил время на телефоне.Если при преобразовании даты я установлю время на 1/2/2019 этого NTPUDPClient, он даст эту дату вместо фактической 29.01.2009.Я хочу преобразовать это время в фактическую дату, даже если пользователь изменит время на телефоне.

Попытался найти способ разрешения этого InetAddress с помощью какого-либо другого компонента, но не смог ничего найти.

public Date getCurrentTimeFromNtpServer() {
    Date result = null;
    NTPUDPClient client = new NTPUDPClient();

    client.setDefaultTimeout(2000);
    for (String host : NTP_SERVERS) {
        try {
            InetAddress inetAddress = InetAddress.getByName(host);
            TimeInfo timeInfo = client.getTime(inetAddress);
            result = DateUtil.toUtc(new Date(timeInfo.getReturnTime()));
            break;
        } catch (IOException e) {
            Logger.warn(TAG, "Failed to get current time MTP", e);
        }
    }
    client.close();
    return result;
}

1 Ответ

0 голосов
/ 29 января 2019

Я наконец нашел ответ.Слишком много примеров в интернете, которые не верны.Это должно быть сделано:

public Date getCurrentTimeFromNtpServer() {

    Date result = null;
    final NTPUDPClient client = new NTPUDPClient();
    client.setDefaultTimeout(2000);
    for (final String host : NTP_SERVERS) {
        try {
            final InetAddress inetAddress = InetAddress.getByName(host);
            final TimeInfo timeInfo = client.getTime(inetAddress);
            final Long time = timeInfo.getMessage().getTransmitTimeStamp().getTime();
            result = DateUtil.toUtc(time);
            SystemUtil.sleep(500);
            break;
        } catch (IOException e) {
            Logger.warn(TAG, "Failed to get current time NTP", e);
        }
    }
    client.close();
    return result;
}

Это даст фактическое время вместо того, которое было создано в NTPUDPClient, и это время телефона.

...