Получить в режиме реального времени - не устройство Установить время в 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")
}
}
`