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
}
}
}