Sobes.tech
Middle

Kako sinhronizovati lokalno vreme korisnika sa vremenom servera?

sobes.tech АИ

Одговор од АИ

Za preciznu sinhronizaciju vremena sa serverom na Android-u preporučuje se korišćenje NTP (Network Time Protocol). Android ima ugrađene mehanizme za to, ali ponekad je potrebno ručno zatražiti vreme ili koristiti alternativne pristupe.

Ugrađena sinhronizacija Android:

Android sistem automatski sinhronizuje vreme putem NTP preko mrežnih usluga, obično koristeći standardne NTP servere. Korisnik može izabrati opciju "Koristi mrežno vreme" u podešavanjima. Ova metoda je najpouzdanija za obične scenarije.

Ručno sinhronizovanje (za posebne slučajeve):

Na nekim aplikacijama ili uređajima bez mrežne veze može biti potrebno ručno zatražiti vreme sa određenog NTP servera. Za to možete koristiti Apache Commons Net ili druge biblioteke za NTP.

Primer korišćenja 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"; // Primer NTP servera

    public long getSynchronizedTime() {
        NTPUDPClient client = new NTPUDPClient();
        // Podrazumevani timeout soketa je 0, pa ga postavljamo
        client.setDefaultTimeout(10000); // 10 sekundi

        try {
            // Zatraži adresu NTP servera
            InetAddress inetAddress = InetAddress.getByName(NTP_SERVER);
            // Dobij informacije o vremenu
            TimeInfo timeInfo = client.getTime(inetAddress);

            // Obradi informacije o vremenu
            long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();

            // Izračunaj razliku između lokalnog i mrežnog vremena
            long localTime = System.currentTimeMillis();
            long networkTime = timeInfo.getReturnTime();
            long roundTripDelay = networkTime - timeInfo.getOriginateTimeStamp().getTime();
            long offset = timeInfo.getOffset();

            // Sinhronizovano vreme je lokalno vreme + offset
            long synchronizedTime = localTime + offset;

            return synchronizedTime;

        } catch (IOException e) {
            e.printStackTrace();
            // U slučaju greške, vratite -1
            return -1;
        } finally {
            client.close();
        }
    }
}

Sinhronizacija putem HTTP zahteva (manje precizno):

Možete dobiti vreme sa servera slanjem HTTP zahteva i analizom zaglavlja Date u odgovoru. Ova metoda je manje precizna od NTP, jer zavisi od kašnjenja mreže i tačnosti časovnika na veb serveru.

Primer:

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"; // Primer URL

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

            // Dobij zaglavlje Date
            String dateHeader = connection.getHeaderField("Date");
            if (dateHeader != null) {
                // Analiziraj datum iz zaglavlja. Ovaj format može da se razlikuje.
                Date date = new Date(dateHeader);
                return date.getTime();
            } else {
                return -1; // Nedostaje zaglavlje "Date"
            }

        } catch (IOException e) {
            e.printStackTrace();
            return -1; // Greška pri zahtevu
        }
    }
}