从互联网获取实际时间?

时间:2016-05-03 06:29:32

标签: android datetime time

如何获得'当前(实际)时间'或者网络运营商的时间' 如果设备时间改变了吗?

我试图通过< LocationManager'< LocationManager''''''类。但它给出了最后的位置时间,但我需要当前的时间。

有人能告诉我一些从互联网上获取实际时间的正确方法吗?

  • 如果可能,不使用任何外部库。

提前致谢。

5 个答案:

答案 0 :(得分:4)

根据此answer,您可以从NTP服务器获取当前时间。

support.ntp.org library

添加到您的依赖

String timeServer = "server 0.pool.ntp.org";
NTPUDPClient timeClient = new NTPUDPClient();
InetAddress inetAddress = InetAddress.getByName(timeServer);
TimeInfo timeInfo = timeClient.getTime(inetAddress);
long returnTime = timeInfo.getReturnTime();
System.out.println(returnTime)

答案 1 :(得分:3)

你可以使用由地理名称http://www.geonames.org/login提供的其他完整api,例如

,这将需要lat和long

http://api.geonames.org/timezoneJSON?lat=51.5034070&lng=-0.1275920&username=your_user_name

答案 2 :(得分:1)

对于Android:

添加到gradle app模块:

compile 'commons-net:commons-net:3.3'

添加到您的代码:

...
String TAG = "YOUR_APP_TAG";
String TIME_SERVER = "0.europe.pool.ntp.org";
...
public void checkTimeServer() {
    try {
        NTPUDPClient timeClient = new NTPUDPClient();
        InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
        TimeInfo timeInfo = timeClient.getTime(inetAddress);
        long setverTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();

        // store this somewhere and use to correct system time
        long timeCorrection = System.currentTimeMillis()-setverTime;    
    } catch (Exception e) {
        Log.v(TAG,"Time server error - "+e.getLocalizedMessage());
    }
}

注意:前面的答案中提到的timeInfo.getReturnTime()将获得本地系统时间,如果需要服务器时间,则必须使用timeInfo.getMessage()。getTransmitTimeStamp()。getTime()。

答案 3 :(得分:0)

在大多数情况下,从第三方服务器获取时间并不可靠,其中一些是付费服务。

如果要获取准确的时间并用手机检查,则不管使用哪种正确的方法,都可以使用以下简单的技巧来获取实际时间。< / p>

private class GetActualTime extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {
            try {
                HttpURLConnection urlConnection = null;
                StringBuilder result = new StringBuilder();
                try {
                    URL url = new URL(urls[0]);
                    urlConnection = (HttpURLConnection) url.openConnection();
                    int code = urlConnection.getResponseCode();
                    if (code == 200) {
                        InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
                        String line = "";
                        while ((line = bufferedReader.readLine()) != null)
                        result.append(line);
                        in.close();
                    }
                        else {
                        return "error on fetching";
                    }
                    return result.toString();
                } catch (MalformedURLException e) {
                    return "malformed URL";
                } catch (IOException e) {
                   return "io exception";
                } finally {
                    if (urlConnection != null) {urlConnection.disconnect();
                    }
                }
            } catch (Exception e) { return "null"; }
        }

        @Override
        protected void onPostExecute(String time) {
            Calendar calendar = Calendar.getInstance();
            SimpleDateFormat mdformat = new SimpleDateFormat("h:mm");
            String times =  mdformat.format(calendar.getTime());
            try {
                String areatime = time.substring(time.indexOf(String.valueOf(times)), time.indexOf(String.valueOf(times)) + 5).trim(); 
                        Toast.makeText(this, "The actual time is " + areatime, Toast.LENGTH_SHORT).show();

            }
            catch(IndexOutOfBoundsException e){
                        Toast.makeText(this, "Mobile time is not same as Internet time", Toast.LENGTH_SHORT).show();
                }
            }


        }

    }

在onCreate()中调用该类;

new GetActualTime().execute("https://www.google.com/search?q=time");

因此,这实际上是从Google获得时间。这在我的项目中非常出色。为了检查系统时间是否错误,可以使用此技巧。您不必依赖时间服务器,而可以信任Google。

由于检查更为敏感,因此即使提前一分钟或滞后一分钟也会捕获异常。您可以自定义代码。

答案 4 :(得分:-3)

试试这个:

System.currentTimeMillis();