Sobes.tech
Middle

Kā sinhronizēt lietotāja vietējo laiku ar servera laiku?

sobes.tech AI

Atbilde no AI

Precīzai laika sinhronizācijai ar serveri Android platformā ieteicams izmantot NTP (Network Time Protocol). Android ir iebūvēti mehānismi šim nolūkam, bet dažreiz nepieciešams laiku pieprasīt manuāli vai izmantot alternatīvas pieejas.

Android iebūvēta sinhronizācija:

Android sistēma automātiski sinhronizē laiku, izmantojot NTP, parasti izmantojot standarta NTP serverus. Lietotājs var izvēlēties opciju "Izmantot tīkla laiku" iestatījumos. Šī metode ir visuzticamākā ikdienas scenārijiem.

Manuāla sinhronizācija (īpašiem gadījumiem):

Dažās lietojumprogrammās vai ierīcēs bez interneta savienojuma var būt nepieciešams manuāli pieprasīt laiku no konkrēta NTP servera. To var izdarīt, izmantojot Apache Commons Net vai citas bibliotēkas:

Piemērs ar 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"; // NTP servera piemērs

    public long getSynchronizedTime() {
        NTPUDPClient client = new NTPUDPClient();
        client.setDefaultTimeout(10000); // 10 sekundes

        try {
            InetAddress inetAddress = InetAddress.getByName(NTP_SERVER);
            TimeInfo timeInfo = client.getTime(inetAddress);
            long transmitTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();
            long localTime = System.currentTimeMillis();
            long offset = timeInfo.getOffset();
            long synchronizedTime = localTime + offset;
            return synchronizedTime;
        } catch (IOException e) {
            e.printStackTrace();
            return -1;
        } finally {
            client.close();
        }
    }
}

HTTP pieprasījuma sinhronizācija (mazāk precīza):

Laiku no servera var iegūt, nosūtot HTTP pieprasījumu un analizējot atbildes galveni Date. Šī metode ir mazāk precīza, jo atkarīga no tīkla aizkaves un laika uz web servera:

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"; // Piemērs URL

    public long getSynchronizedTime() {
        try {
            URL url = new URL(HTTP_URL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("HEAD");
            connection.connect();
            String dateHeader = connection.getHeaderField("Date");
            if (dateHeader != null) {
                Date date = new Date(dateHeader);
                return date.getTime();
            } else {
                return -1;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return -1;
        }
    }
}

Ieteikumi:

  • Izmantojiet Android iebūvēto sinhronizāciju.
  • Ja nepieciešama lielāka precizitāte vai kontrole pār NTP serveri, izmantojiet Apache Commons Net vai līdzīgas bibliotēkas.
  • HTTP sinhronizācija ir mazāk precīza un nav ieteicama kritiskām operācijām, kas prasa precīzu laiku.
  • Veicot manuālo sinhronizāciju, ņemiet vērā tīkla kļūdas un nepareizos servera atbildes.
  • Veiciet sinhronizāciju fonā, lai neradītu bloķēšanu UI.