如何在Android中从互联网获取当前时间

use*_*619 21 time android

我正在制作一个应用程序,我希望从互联网获取当前时间.

我知道如何从设备中获取时间System.currentTimeMillis,甚至在搜索了很多之后,我也没有得到任何关于如何从互联网上获取它的线索.

sun*_*nil 20

您可以使用以下程序从互联网时间服务器获得时间

import java.io.IOException;

import org.apache.commons.net.time.TimeTCPClient;

public final class GetTime {

    public static final void main(String[] args) {
        try {
            TimeTCPClient client = new TimeTCPClient();
            try {
                // Set timeout of 60 seconds
                client.setDefaultTimeout(60000);
                // Connecting to time server
                // Other time servers can be found at : http://tf.nist.gov/tf-cgi/servers.cgi#
                // Make sure that your program NEVER queries a server more frequently than once every 4 seconds
                client.connect("time.nist.gov");
                System.out.println(client.getDate());
            } finally {
                client.disconnect();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你需要Apache Commons Net库来实现这个目的.下载库并添加到项目构建路径.

(或者您也可以在这里使用修剪过的Apache Commons Net Library:https://www.dropbox.com/s/bjxjv7phkb8xfhh/commons-net-3.1.jar.这足以从互联网上获取时间)

2.运行程序.您将在控制台上打印时间.

  • 由于答案上的那些链接已过时..使用此链接下载:http://www.java2s.com/Code/Jar/c/Downloadcommonsnet33jar.htm (2认同)

Gir*_*air 7

这是我为您创建的方法,您可以在代码中使用它

public String getTime() {
try{
    //Make the Http connection so we can retrieve the time
    HttpClient httpclient = new DefaultHttpClient();
    // I am using yahoos api to get the time
    HttpResponse response = httpclient.execute(new
    HttpGet("http://developer.yahooapis.com/TimeService/V1/getTime?appid=YahooDemo"));
    StatusLine statusLine = response.getStatusLine();
    if(statusLine.getStatusCode() == HttpStatus.SC_OK){
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        response.getEntity().writeTo(out);
        out.close();
        // The response is an xml file and i have stored it in a string
        String responseString = out.toString();
        Log.d("Response", responseString);
        //We have to parse the xml file using any parser, but since i have to 
        //take just one value i have deviced a shortcut to retrieve it
        int x = responseString.indexOf("<Timestamp>");
        int y = responseString.indexOf("</Timestamp>");
        //I am using the x + "<Timestamp>" because x alone gives only the start value
        Log.d("Response", responseString.substring(x + "<Timestamp>".length(),y) );
        String timestamp =  responseString.substring(x + "<Timestamp>".length(),y);
        // The time returned is in UNIX format so i need to multiply it by 1000 to use it
        Date d = new Date(Long.parseLong(timestamp) * 1000);
        Log.d("Response", d.toString() );
        return d.toString() ;
    } else{
        //Closes the connection.
        response.getEntity().getContent().close();
        throw new IOException(statusLine.getReasonPhrase());
    }
}catch (ClientProtocolException e) {
Log.d("Response", e.getMessage());
}catch (IOException e) {
Log.d("Response", e.getMessage());
}
return null;
}
Run Code Online (Sandbox Code Playgroud)


rpa*_*abi 6

如果您不关心毫秒精度,并且您已经在使用 google firebase 或不介意使用它(他们提供免费套餐),请查看:https : //firebase.google.com/docs/database /android/离线功能#clock-skew

基本上,firebase 数据库有一个字段,用于提供设备时间和 firebase 服务器时间之间的偏移值。您可以使用此偏移量来获取当前时间。

DatabaseReference offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset");
offsetRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    double offset = snapshot.getValue(Double.class);
    double estimatedServerTimeMs = System.currentTimeMillis() + offset;
  }

  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});
Run Code Online (Sandbox Code Playgroud)

正如我所说,根据网络延迟,它会不准确。

  • 这个字段会被缓存,所以如果你想多次获取这个值,你需要做`FirebaseDatabase.getInstance().goOffline()`和`goOnline()` (3认同)