我正在制作一个应用程序,我想在其中从互联网上获取当前时间。
我知道如何使用 设备从设备上获取时间System.currentTimeMillis
,即使经过大量搜索,我也没有得到任何关于如何从互联网上获取时间的线索。
您可以使用以下程序从互联网时间服务器获取时间
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();
}
}
}
1.您需要Apache Commons Net库才能使其工作。下载库并添加到您的项目构建路径。
(或者您也可以在这里使用修剪过的 Apache Commons Net Library:https ://www-us.apache.org/dist//commons/net/binaries/commons-net-3.6-bin.tar.gz这足以从互联网上获取时间)
2.运行程序。您将在控制台上打印时间。
这是我为您创建的一种方法,您可以在您的代码中使用它
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;
}
如果您不关心毫秒精度,并且您已经在使用 google firebase 或不介意使用它(他们提供免费层),请查看:https ://firebase.google.com/docs/database /android/offline-capabilities#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");
}
});
正如我所说,基于网络延迟将是不准确的。
我认为最好的解决方案是使用 SNTP,特别是来自 Android 本身的 SNTP 客户端代码,例如: http: //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/ 4.1.1_r1/android/net/SntpClient.java/
我相信当蜂窝网络不可用时(例如 wifi 平板电脑),Android 会使用 SNTP 进行自动日期/时间更新。
我认为它比其他解决方案更好,因为它使用 SNTP/NTP 而不是 Apache TimeTCPClient 使用的时间协议 (RFC 868)。我不知道 RFC 868 有什么不好的地方,但是 NTP 更新并且似乎已经取代它并且被更广泛地使用。我相信没有蜂窝网络的 Android 设备使用 NTP。
另外,因为它使用套接字。提出的一些解决方案使用 HTTP,因此它们的准确性会有所损失。
您将需要访问以 XML 或 JSON 格式提供当前时间的 Web 服务。
如果您没有找到此类服务,您可以从网页解析时间,例如http://www.timeanddate.com/worldclock/,或者使用简单的 PHP 页面在服务器上托管您自己的时间服务例子。
查看 JSoup 以解析 HTML 页面。
上面没有任何东西对我有用。这就是我最终得到的(使用 Volley);
此示例还转换为另一个时区。
Long time = null;
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.timeapi.org/utc/now";
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = simpleDateFormat.parse(response);
TimeZone tz = TimeZone.getTimeZone("Israel");
SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
destFormat.setTimeZone(tz);
String result = destFormat.format(date);
Log.d(TAG, "onResponse: " + result.toString());
} catch (ParseException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.w(TAG, "onErrorResponse: "+ error.getMessage());
}
});
queue.add(stringRequest);
return time;
在 gradle 中导入 Volley:
compile 'com.android.volley:volley:1.0.0'
Stackoverflow 中已有明确的答案
https://stackoverflow.com/a/71274296/11789675
调用此 url 或用作 GET API
http://worldtimeapi.org/api/timezone/Asia/Kolkata
反应会像
{
"abbreviation": "IST",
"client_ip": "45.125.117.46",
"datetime": "2022-02-26T10:50:43.406519+05:30",
}
我用过 volley .. 并从 Server api (php) 获得时间..
public void GetServerTime() {
StringRequest volleyrequest = new StringRequest(Request.Method.GET, url, new
Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jObject = new JSONObject(response);
result = jObject.toString();
} catch (JSONException | ParseException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Data Conversion Failed.", Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
Log.w("onErrorResponse", "" + error.getMessage());
Toast.makeText(getApplicationContext(), "NO Internet connection! Please check your network.", Toast.LENGTH_LONG).show();
}
});
RequestQueue queue = Volley.newRequestQueue(ProductDetailActivity.this);
queue.add(volleyrequest);
}
得到时间后。我无法用于我的目的..(我的目的)我有每个产品的结束时间,我必须将我的当前时间与产品结束时间进行比较。如果它有效,它可以添加到购物车中,否则没有。