我正在尝试从NTP服务器获取时间。我有一种方法,它要求多个服务器获取时间(如果第一个服务器给出结果,则不会要求其他服务器进行备份)。为了从InetAddress解析日期,我使用库中的TimeInfo:commons-net:commons-net:3.0.1。这样可以解决时间,但是当我手动更改电话时间时,这成为一个问题。如果我在转换日期时将时间设置为1/2/2019,则此NTPUDPClient将给出该日期,而不是实际的1/29/2019。我希望将此时间转换为实际日期,即使用户将在手机上更改时间。
试图搜索如何用其他组件来解析此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;
}
答案 0 :(得分:0)
我终于找到了答案。互联网上有太多不正确的示例。应该做的是:
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中创建的实际时间,它是电话时间。