在不允许用户操纵时间的情况下从 ntp 服务器获取时间
Getting time from ntp server without allowing the user to manipulate the time
我正在尝试从 NTP 服务器获取时间。我有一种方法,它要求多个服务器获取时间(如果第一个服务器给出结果,则不会要求另一个服务器进行备份)。为了从 InetAddress 解析日期,我使用库中的 TimeInfo:commons-net:commons-net:3.0.1。这解决了应该的时间问题,但是当我手动更改 phone 上的时间时,它就成了一个问题。如果我在转换日期时将时间设置为 1/2/2019,此 NTPUDPClient 将给出此日期,而不是实际的 1/29/2019。我想将这个时间转换为实际日期,即使用户将更改 phone.
上的时间
尝试搜索如何使用其他组件解析此 InetAddress,但找不到任何内容。
public Date getCurrentTimeFromNtpServer() {
Date result = null;
NTPUDPClient client = new NTPUDPClient();
client.setDefaultTimeout(2000);
for (String host : NTP_SERVERS) {
try {
InetAddress inetAddress = InetAddress.getByName(host);
TimeInfo timeInfo = client.getTime(inetAddress);
result = DateUtil.toUtc(new Date(timeInfo.getReturnTime()));
break;
} catch (IOException e) {
Logger.warn(TAG, "Failed to get current time MTP", e);
}
}
client.close();
return result;
}
我终于找到了答案。网上例子太多,都不对。应该做的是:
public Date getCurrentTimeFromNtpServer() {
Date result = null;
final NTPUDPClient client = new NTPUDPClient();
client.setDefaultTimeout(2000);
for (final String host : NTP_SERVERS) {
try {
final InetAddress inetAddress = InetAddress.getByName(host);
final TimeInfo timeInfo = client.getTime(inetAddress);
final Long time = timeInfo.getMessage().getTransmitTimeStamp().getTime();
result = DateUtil.toUtc(time);
SystemUtil.sleep(500);
break;
} catch (IOException e) {
Logger.warn(TAG, "Failed to get current time NTP", e);
}
}
client.close();
return result;
}
这将给出实际时间,而不是它在 NTPUDPClient 中创建的时间,它是 phone 时间。
我正在尝试从 NTP 服务器获取时间。我有一种方法,它要求多个服务器获取时间(如果第一个服务器给出结果,则不会要求另一个服务器进行备份)。为了从 InetAddress 解析日期,我使用库中的 TimeInfo:commons-net:commons-net:3.0.1。这解决了应该的时间问题,但是当我手动更改 phone 上的时间时,它就成了一个问题。如果我在转换日期时将时间设置为 1/2/2019,此 NTPUDPClient 将给出此日期,而不是实际的 1/29/2019。我想将这个时间转换为实际日期,即使用户将更改 phone.
上的时间尝试搜索如何使用其他组件解析此 InetAddress,但找不到任何内容。
public Date getCurrentTimeFromNtpServer() {
Date result = null;
NTPUDPClient client = new NTPUDPClient();
client.setDefaultTimeout(2000);
for (String host : NTP_SERVERS) {
try {
InetAddress inetAddress = InetAddress.getByName(host);
TimeInfo timeInfo = client.getTime(inetAddress);
result = DateUtil.toUtc(new Date(timeInfo.getReturnTime()));
break;
} catch (IOException e) {
Logger.warn(TAG, "Failed to get current time MTP", e);
}
}
client.close();
return result;
}
我终于找到了答案。网上例子太多,都不对。应该做的是:
public Date getCurrentTimeFromNtpServer() {
Date result = null;
final NTPUDPClient client = new NTPUDPClient();
client.setDefaultTimeout(2000);
for (final String host : NTP_SERVERS) {
try {
final InetAddress inetAddress = InetAddress.getByName(host);
final TimeInfo timeInfo = client.getTime(inetAddress);
final Long time = timeInfo.getMessage().getTransmitTimeStamp().getTime();
result = DateUtil.toUtc(time);
SystemUtil.sleep(500);
break;
} catch (IOException e) {
Logger.warn(TAG, "Failed to get current time NTP", e);
}
}
client.close();
return result;
}
这将给出实际时间,而不是它在 NTPUDPClient 中创建的时间,它是 phone 时间。