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

时间:2010-05-12 09:27:48

标签: java datetime

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

Date date = new Date();

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

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

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

谢谢!

4 个答案:

答案 0 :(得分:7)

您可以查看

中提供的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代码。

答案 1 :(得分:5)

本地网络

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

网络时间协议

或者你可以使用陈旧的Network Time Protocol (NTP)与现有的服务器和客户端实现捆绑在一起的大多数OS。有关详情,请参阅the accepted Answer by aioobe

考虑将该时间服务器计算机放在network’s DMZ中,以便更新来自互联网上的时间服务器,例如pool.ntp.org projectthose provided by the United States federal government (NIST)

因特网

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

问题how to make my java app get global time from some online clock中讨论了这一点。

另见问题:Java NTP clientJava client for time server, such as Network Time Protocol (NTP)

无线电时钟

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

Meinberg Global公司至少提供several such devices

photo of a couple of external radio clock devices

GPS

与上述无线电时钟类似,GPS(Global Positioning System)信号的接收器也可能捕获并转发time signal。或者GALILEOGLONASS或其他Radionavigation-satellite service

日晷

在窗口外放置sundial。将webcam附加到相关计算机上。将网络摄像头放在窗口中。编写一个应用程序来解释日历当前图像的时间。

photo of a sundial on a pedestal in a garden

警告:此解决方案在Seattle中无效。

java.time.Clock

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

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

Instant instant = Instant.now( yourClockGoesHere ) ;

出于测试目的,请注意Clock自身Clock静态提供的offset替代实施:fixedtickDate等。

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

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

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

答案 2 :(得分:-1)

您可以使用以下代码:

        LocalDate localDate = LocalDate.now();
        int year = localDate.getYear();
        int month = localDate.getMonthValue();
        int date = localDate.getDayOfMonth();

答案 3 :(得分:-3)

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

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