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
的替代实现: fixed
, offset
, tick
等。
避免使用最早版本的Java中的旧版日期时间类,例如Date
和Calendar
。 这些麻烦的类完全被java.time类取代。
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- 更高版本的Android捆绑java.time类的实现。
- 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
通常,服务器会定期与在线时间服务器同步时间。 所以你的服务器时间应该准确。 如果没有,请联系您的管理员。
要获得例如GMT时间,请使用Calendar和TimeZone类。