Получить в режиме реального времени - не устройство Установить время в Android

Как узнать реальное географическое время, так как в моем приложении я хочу прикрепить реальное время к своему приложению.

Так что, если пользователь изменяет время на своем устройстве, я получу только реальное преобладающее время, а НЕ ВРЕМЯ УСТРОЙСТВА.

Мой вопрос сбивает с толку, но попробуйте понять на простом языке -

Я не хочу ВРЕМЯ УСТРОЙСТВА, я хочу РЕАЛЬНОЕ ПРЕДВАРИТЕЛЬНОЕ ВРЕМЯ в любой момент

3 ответа

Вам нужно использовать протокол NTP (сетевой протокол времени):

Вот код, который я нашел где-то еще.. и я использую его. это использует библиотеку Apache Commons.

// Список серверов времени: http://tf.nist.gov/service/time-servers.html

Вот код Java для вас

public class TimeLookup { public static final String TIME_SERVER = "time-a.nist.gov";

    public static void main(String[] args) throws Exception {
        NTPUDPClient timeClient = new NTPUDPClient();
        InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
        TimeInfo timeInfo = timeClient.getTime(inetAddress);
        long returnTime = timeInfo.getReturnTime();
        Date time = new Date(returnTime);
        System.out.println("Time from " + TIME_SERVER + ": " + time);
    }

}

Нет Android API, чтобы получить такое время. Пользователь всегда может изменить время устройства, ничего с этим не поделаешь.

Лучше всего будет запустить сервер с веб-сервисом, с которого вы сможете получить время. Поскольку вы управляете сервером, вы можете убедиться, что он возвращает правильное время.

Следующий код работал со мной, чтобы получить реальную дату, даже если у устройства неправильная дата. Благодаря @Stefano.

      import org.apache.commons.net.ntp.NTPUDPClient
import java.net.InetAddress
import java.text.SimpleDateFormat
import java.util.*


object DateOperation {

    private const val TIME_SERVER = "time-a.nist.gov"
    const val DATE_PATTERN = "yyyy-MM-dd"

    suspend fun getRealDay(): String {
        val timeClient = NTPUDPClient()
        val inetAddress: InetAddress = InetAddress.getByName(TIME_SERVER)
        val timeInfo = timeClient.getTime(inetAddress)
        val returnTime = timeInfo.message.receiveTimeStamp.date
        val t = SimpleDateFormat(DATE_PATTERN, Locale.ENGLISH)
        return t.format(returnTime)
    }
}


после добавления зависимости:

      implementation 'commons-net:commons-net:3.6'

Затем используйте его как

      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleScope.launch(Dispatchers.IO) {
            val date = getRealDay()
            Log.d("TestTest", "onCreate: $date")

        }

    }

`

Другие вопросы по тегам