Sobes.tech
Middle

Hoe synchroniseer je de lokale tijd van de gebruiker met de servertijd?

sobes.tech AI

Antwoord van AI

Voor nauwkeurige tijdsynchronisatie met de server op Android is het aan te raden het NTP-protocol (Network Time Protocol) te gebruiken. Android heeft ingebouwde mechanismen hiervoor, maar soms is het nodig om handmatig de tijd op te vragen of alternatieve benaderingen te gebruiken.

Ingebouwde synchronisatie van Android:

Het Android-systeem synchroniseert automatisch de tijd via NTP via netwerkdiensten, meestal met standaard NTP-servers. De gebruiker kan de optie "Gebruik netwerk tijd" kiezen in de instellingen. Deze methode is het meest betrouwbaar voor gewone scenario's.

Handmatige synchronisatie (voor speciale gevallen):

In sommige apps of op apparaten zonder netwerkverbinding kan het nodig zijn om handmatig de tijd op te vragen van een specifieke NTP-server. Hiervoor kunnen Apache Commons Net of andere bibliotheken voor NTP worden gebruikt.

Voorbeeld van gebruik van Apache Commons Net:

import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.TimeInfo;
import java.io.IOException;
import java.net.InetAddress;

public class TimeSynchronizer {

    private static final String NTP_SERVER = "pool.ntp.org"; // Voorbeeld NTP-server

    public long getSynchronizedTime() {
        NTPUDPClient client = new NTPUDPClient();
        // Standaard socket timeout is 0, dus instellen
        client.setDefaultTimeout(10000); // 10 seconden

        try {
            // Vraag het adres van de NTP-server op
            InetAddress inetAddress = InetAddress.getByName(NTP_SERVER);
            // Vraag de tijdinformatie op
            TimeInfo timeInfo = client.getTime(inetAddress);

            // Verwerk de tijdinformatie
            long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();

            // Bereken het verschil tussen lokale en servertijd
            long localTime = System.currentTimeMillis();
            long networkTime = timeInfo.getReturnTime();
            long roundTripDelay = networkTime - timeInfo.getOriginateTimeStamp().getTime();
            long offset = timeInfo.getOffset();

            // Gecorrigeerde tijd is lokale tijd + offset
            long synchronizedTime = localTime + offset;

            return synchronizedTime;

        } catch (IOException e) {
            e.printStackTrace();
            // Bij fout, -1 teruggeven of uitzondering gooien
            return -1;
        } finally {
            client.close();
        }
    }
}

Synchronisatie via HTTP-verzoek (minder nauwkeurig):

Je kunt de tijd van de server krijgen door een HTTP-verzoek te sturen en de Date header in het antwoord te analyseren. Deze methode is minder nauwkeurig dan NTP, omdat het afhankelijk is van netwerkvertraging en de klok op de webserver.

Voorbeeld:

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;

public class HttpTimeSynchronizer {

    private static final String HTTP_URL = "https://www.google.com"; // Voorbeeld URL

    public long getSynchronizedTime() {
        try {
            URL url = new URL(HTTP_URL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("HEAD"); // Alleen headers opvragen
            connection.connect();

            // Haal de Date header op
            String dateHeader = connection.getHeaderField("Date");
            if (dateHeader != null) {
                // Parse de datum uit de header. Dit formaat kan verschillen.
                Date date = new Date(dateHeader);
                return date.getTime();
            } else {
                return -1; // "Date" header ontbreekt
            }

        } catch (IOException e) {
            e.printStackTrace();
            return -1; // Fout bij verzoek
        }
    }
}

Aanbevelingen:

  • Vertrouw voor de meeste gevallen op de ingebouwde synchronisatie van Android.
  • Gebruik Apache Commons Net of vergelijkbare bibliotheken als hogere precisie of controle over de NTP-server nodig is.
  • Synchronisatie via HTTP is minder nauwkeurig en wordt niet aanbevolen voor kritische operaties die afhankelijk zijn van exacte tijd.
  • Bij handmatige synchronisatie, handel netwerkfouten en onjuiste serverantwoorden af.
  • Voer synchronisatie uit in een achtergrondthread om de UI niet te blokkeren.