我想要格林威治标准时间,而且我也不想依赖我的系统日期时间。基本上,我想使用时间同步服务器,如in.pool.ntp.org印度GMT计算,或可能是我走错方向了!
如何在java中做到这一点?
有什么java库可以从时间服务器获取时间吗?
发布于 2013-01-16 11:02:10
sp0d并不完全正确:
timeInfo.getReturnTime(); // Returns time at which time message packet was received by local machine所以它只返回当前的系统时间,而不是接收到的。见TimeInfo手册页。
你应该用
timeInfo.getMessage().getTransmitTimeStamp().getTime();而不是。
因此,代码块将是:
String TIME_SERVER = "time-a.nist.gov";
NTPUDPClient timeClient = new NTPUDPClient();
InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
TimeInfo timeInfo = timeClient.getTime(inetAddress);
long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();
Date time = new Date(returnTime);发布于 2012-11-25 00:42:39
这是我在别的地方找到的密码..。我在用它。使用。
时间服务器列表:NIST因特网时间服务
import java.net.InetAddress;
import java.util.Date;
import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.TimeInfo;
public class TimeLookup {
public static void main() throws Exception {
String TIME_SERVER = "time-a.nist.gov";
NTPUDPClient timeClient = new NTPUDPClient();
InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
TimeInfo timeInfo = timeClient.getTime(inetAddress);
long returnTime = timeInfo.getReturnTime();
Date time = new Date(returnTime);
System.out.println("Time from " + TIME_SERVER + ": " + time);
}
}返回time-d.nist.gov:Sun Nov 25 06:04:34 IST 2012的输出时间
发布于 2018-11-29 09:18:05
我知道这是一个老问题,但我注意到所有的答案都不正确或复杂。
实现它的一个很好而且简单的方法是使用库。这个库将提供一个NTPUDPClient类来管理无连接的NTP请求。这个类将返回一个TimeInfo实例。这个对象应该运行计算方法来计算系统时间和NTP服务器时间之间的偏移量。让我们尝试在这里实现它。
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>NTPUDPClient类的新实例。InetAddress。NTPUDPClient.getTime()方法从指定的服务器检索具有时间信息的TimeInfo实例。TimeStamp.getNtpTime(currentTime + offset).getTime()获取基于Java的NTP时间戳对象。这里我们有一个基本的实现:
import java.net.InetAddress;
import java.util.Date;
import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.TimeInfo;
public class NTPClient {
private static final String SERVER_NAME = "pool.ntp.org";
private volatile TimeInfo timeInfo;
private volatile Long offset;
public static void main() throws Exception {
NTPUDPClient client = new NTPUDPClient();
// We want to timeout if a response takes longer than 10 seconds
client.setDefaultTimeout(10_000);
InetAddress inetAddress = InetAddress.getByName(SERVER_NAME);
TimeInfo timeInfo = client.getTime(inetAddress);
timeInfo.computeDetails();
if (timeInfo.getOffset() != null) {
this.timeInfo = timeInfo;
this.offset = timeInfo.getOffset();
}
// This system NTP time
TimeStamp systemNtpTime = TimeStamp.getCurrentTime();
System.out.println("System time:\t" + systemNtpTime + " " + systemNtpTime.toDateString());
// Calculate the remote server NTP time
long currentTime = System.currentTimeMillis();
TimeStamp atomicNtpTime = TimeStamp.getNtpTime(currentTime + offset).getTime()
System.out.println("Atomic time:\t" + atomicNtpTime + " " + atomicNtpTime.toDateString());
}
public boolean isComputed()
{
return timeInfo != null && offset != null;
}
}你会得到这样的东西:
System time: dfaa2c15.2083126e Thu, Nov 29 2018 18:12:53.127
Atomic time: dfaa2c15.210624dd Thu, Nov 29 2018 18:12:53.129https://stackoverflow.com/questions/4442192
复制相似问题