如何获得'当前(实际)时间'或者网络运营商的时间' 如果设备时间改变了吗?
我试图通过< LocationManager'< LocationManager''''''类。但它给出了最后的位置时间,但我需要当前的时间。
有人能告诉我一些从互联网上获取实际时间的正确方法吗?
提前致谢。
答案 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和longhttp://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();