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

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

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

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

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


person Dwivedi Ji    schedule 04.04.2013    source источник
comment
@penguat Я просто хочу знать, что такое реальное время, а не время UTC или GMT.   -  person Dwivedi Ji    schedule 04.04.2013
comment
Вы имеете в виду местное время в месте расположения устройства?   -  person penguat    schedule 04.04.2013
comment
Что именно вы имеете в виду под реальным временем?   -  person Kumar Bibek    schedule 04.04.2013


Ответы (2)


Необходимо использовать протокол NTP (Network Time Protocol):

Вот код, который я нашел где-то еще... и я его использую. При этом используется библиотека Apache Commons, которую можно установить с помощью Gradle (добавляя зависимость от commons-net:commons-net:3.6)

Если вам нужен список серверов времени, проверьте: 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 должен выполняться в фоновом потоке и включать зависимость gradle:

implementation 'commons-net:commons-net:3.6'
person Gaurav Arora    schedule 04.04.2013
comment
В моем случае действительная метка времени была найдена с помощью: timeInfo.getMessage().getReceiveTimeStamp().getTime() - person androidevil; 09.10.2015
comment
long returnTime = timeInfo.getMessage().getReceiveTimeStamp().getTime(); - person Stefano; 07.10.2016
comment
более старый пост, но здесь важно: Стефано прав. Если получить время, как показано в посте, он возвращает (описано в API) ... пакет сообщения о времени был получен локальным компьютером . Кажется, это возвращает время устройства, я пробовал. Но если вы используете timeInfo.getMessage().getReceiveTimeStamp().getTime() , вы получаете (описано в API) ...время приема, как определено в RC_1305, которое является чистым временем, независимо от того, что определено в устройстве. - person Opiatefuchs; 15.08.2017
comment
Даже если вы используете этот метод, изменение времени на телефоне приведет к тому, что NTPUDPClient предоставит вам это время вместо времени с хоста. - person f.trajkovski; 29.01.2019

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

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

person Raghav Sood    schedule 04.04.2013
comment
мы можем использовать joda time lib? - person Prashanth Debbadwar; 28.11.2016