Java:从服务器而不是系统时钟获取当前日期和时间

在我的Java程序中,我需要创建当前时刻的实例。 我用

Date date = new Date(); 

这根据主机的系统时钟给出了当前日期和时间。 有什么方法可以从在线服务器获取当前日期和时间吗? 也许是世界时间服务器?

我看过这篇post ,它描述了我想要的东西,但我担心我需要的帮助比那里提供的更多。

简而言之,我想获得一个不依赖于主机系统时钟的日期和时间。

谢谢!

您可以查看可用的Java NTP客户端演示

http://www.docjar.com/html/api/examples/ntp/NTPClient.java.html

以及一些利用此客户端的示例代码

http://www.docjar.com/html/api/examples/ntp/TimeClient.java.html

这是大约170行记录良好的java代码。

本地网络

如果您的计算机已连接到本地网络,请连接到充当可信赖时间服务器的某台计算机。 你可以编写自己的时间服务器。

网络时间协议

或者,您可以将老旧的网络时间协议(NTP)与大多数操作系统捆绑在一起的现有服务器和客户端实现一起使用。 有关详细信息,请参阅aioobe接受的答案 。

考虑将该时间服务器计算机放置在网络的DMZ中,以便从因特网上的时间服务器(例如pool.ntp.org项目)或美国联邦政府(NIST)提供的服务器进行更新。

互联网

如果您的计算机已连接到Internet,请连接到可信赖的时间服务器。 如上所述,使用自定义协议(如Web服务)或使用NTP 。

这在问题中讨论, 如何使我的Java应用程序从一些在线时钟获得全球时间

另请参阅问题: Java NTP客户端时间服务器的Java客户端,例如网络时间协议(NTP)

无线电时钟

获得具有USB连接的无线电时钟 ,用于通过连接到诸如primefaces钟的时间标准的无线电发射器发送的时间码同步的当前时间的输出。 发射机正在世界各地的许多国家广播。

至少, Meinberg Global公司提供了几种这样的设备 。

几个外部无线电时钟设备的照片

全球定位系统

与上面的无线电时钟类似,GPS( 全球定位系统 )信号的接收器也可以捕获并中继时间信号 。 或者也许是GALILEO , GLONASS或其他卫星无线电导航业务 。

将日su放在窗户外面。 将网络摄像头连接到相关计算机。 将网络摄像头放在窗口中。 编写一个应用程序来解释日历当前图像的时间。

日规的照片在一个垫座的在庭院里

警告:此解决方案在西雅图不起作用。


java.time.Clock

要利用当前时刻的任何供应商,请编写抽象java.time.Clock类的子类。

您可以将Clock实现作为参数传递给各种java.time方法。 例如, Instant.now( clock )

 Instant instant = Instant.now( yourClockGoesHere ) ; 

出于测试目的,请注意Clock本身静态可用的Clock的替代实现: fixedoffsettick等。

避免使用最早版本的Java中的旧版日期时间类,例如DateCalendar 。 这些麻烦的类完全被java.time类取代。


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

通常,服务器会定期与在线时间服务器同步时间。 所以你的服务器时间应该准确。 如果没有,请联系您的管理员。

要获得例如GMT时间,请使用Calendar和TimeZone类。