首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Internet时间服务器获取时间?

如何使用Internet时间服务器获取时间?
EN

Stack Overflow用户
提问于 2010-12-14 17:33:01
回答 5查看 49.5K关注 0票数 16

我想要格林威治标准时间,而且我也不想依赖我的系统日期时间。基本上,我想使用时间同步服务器,如in.pool.ntp.org印度GMT计算,或可能是我走错方向了!

如何在java中做到这一点?

有什么java库可以从时间服务器获取时间吗?

EN

回答 5

Stack Overflow用户

发布于 2013-01-16 11:02:10

sp0d并不完全正确:

代码语言:javascript
复制
timeInfo.getReturnTime(); // Returns time at which time message packet was received by local machine

所以它只返回当前的系统时间,而不是接收到的。见TimeInfo手册页

你应该用

代码语言:javascript
复制
timeInfo.getMessage().getTransmitTimeStamp().getTime();

而不是。

因此,代码块将是:

代码语言:javascript
复制
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);
票数 22
EN

Stack Overflow用户

发布于 2012-11-25 00:42:39

这是我在别的地方找到的密码..。我在用它。使用。

时间服务器列表:NIST因特网时间服务

代码语言:javascript
复制
 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.govSun Nov 25 06:04:34 IST 2012的输出时间

票数 8
EN

Stack Overflow用户

发布于 2018-11-29 09:18:05

我知道这是一个老问题,但我注意到所有的答案都不正确或复杂。

实现它的一个很好而且简单的方法是使用。这个库将提供一个NTPUDPClient类来管理无连接的NTP请求。这个类将返回一个TimeInfo实例。这个对象应该运行计算方法来计算系统时间和NTP服务器时间之间的偏移量。让我们尝试在这里实现它。

  1. 添加到项目中。
代码语言:javascript
复制
<dependency>
  <groupId>commons-net</groupId>
  <artifactId>commons-net</artifactId>
  <version>3.6</version>
</dependency>
  1. 创建NTPUDPClient类的新实例。
  2. 设置默认超时
  3. 获取NTP服务器的InetAddress
  4. 调用NTPUDPClient.getTime()方法从指定的服务器检索具有时间信息的TimeInfo实例。
  5. 调用computeDetails()方法来计算和验证NTP消息包的详细信息。
  6. 最后,使用此代码TimeStamp.getNtpTime(currentTime + offset).getTime()获取基于Java的NTP时间戳对象。

这里我们有一个基本的实现:

代码语言:javascript
复制
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;
  }
}

你会得到这样的东西:

代码语言:javascript
复制
System time:    dfaa2c15.2083126e  Thu, Nov 29 2018 18:12:53.127
Atomic time:    dfaa2c15.210624dd  Thu, Nov 29 2018 18:12:53.129
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4442192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档