检测系统时钟是否改变?

时间:2009-07-15 10:53:45

标签: java

我正在研究Java项目的概念,该项目检测计算机时钟何时被更改。想法是在计算机时钟上记录日期和时间并将其存储在文件中。然后,我希望能够在其上运行规则,如果时钟已更改,则显示消息。我也在考虑合并诸如“允许不超过5分钟的更改”等规则。这是为了方便将时间改变为奇数分钟。

我还需要合并时钟所做的更改。例如,在一年中的某些时间(英国时间)前进一小时或后退一小时。

我不确定是否已经有一个Java系统能够实现这一目标,但我确实不知道从哪里开始。

7 个答案:

答案 0 :(得分:1)

Java无论如何都从系统时钟获取所有时间/日期信息,因此无法知道底层系统时钟是否已被更改。如果您将日期和时间存储在一个文件中 - 这将检测时间是否已被设置(即 - 文件中的时间是在当前时间之后,并且没有发生DST) - 但它不能检测时间是否已设置为前进(即 - 文件中的时间是当前时间前2小时 - 真的已经过了2小时,或者用户在程序未运行时将时钟提前2小时?)。你可以做这样的事情的唯一方法是使用已知的Time Server,而不是在文件中保存时间,保存时间服务器和本地系统时钟之间的偏移量。

答案 1 :(得分:1)

如果您可以依赖网络连接,您可以将时间与互联网时间服务器(CBATG)的时间进行比较。

只需将当地时间和获取时间转换为相同的时区并存储差异。如果差异变化超过允许的5分钟,你知道它已被修改。

答案 2 :(得分:1)

如果我理解你的问题,那么你要做的就是假设最初,系统时钟处于最佳状态。然后,在每分钟后,您检索文件中的最后一个条目(最后一个或第一个,您选择的任何方法),并确保两次之间的差异是60秒或您选择的任何其他时间间隔。

示例: 在时间0,您将文件放在12:00:00 在时间1,您将12:01:00(从系统时钟检索)与12:00:00(您从文件中检索)进行比较,并认为它没有问题并将其写入文件。 ... 在某个时间n,您比较xx:yy:zz,它与最后一个条目的差异不是60秒,因此检测到了更改。 ...

我相信您所讨论的规则涉及从文件中取出最后一个条目并与您从系统时钟检索的当前时间进行比较。然而,这是否是一个好的方法是有争议的。

答案 3 :(得分:0)

首先:时钟经常改变veeeery。尝试使用java.util.Timer进行更新。日历适用于您的时间系统。

http://java.sun.com/javase/6/docs/api/是你的朋友。

从小处开始,一步一步。这是我的建议。

答案 4 :(得分:0)

使用Joda time库的好地方。理论上,您只需要检查本地时区是否在DST和非DST状态之间移动 - 如果您不想检查本地时间转换。

答案 5 :(得分:0)

我没有尝试过这个,但它可能会有一个后台线程,每分钟唤醒一次,获取当前时间,并将其与上次看到的相比较。从理论上讲,差异应该非常接近一分钟。如果它与此有很大不同,那就意味着时钟发生了变化。

答案 6 :(得分:0)

你似乎要求两个非常不同的东西:

  • 当用户或系统管理员将计算机的时钟调整或更正到某个时刻时(要么设置为真实的当前日期时间,要么设置为另一个过去/未来的日期时间,以用于测试或恶意目的)。
  • Daylight Saving Time (DST)等事件显示的小时 - 分钟更改时。

时钟操作

首先,没有简单的方法可以做到这一点。您偶尔可以对当前日期时间进行采样,记录,然后再次采样。您可以在UTC中执行此操作,以避免将DST秋季更改误认为是用户/系统管理员更改。

使用java.time类的示例代码。避免旧的过时的非java.time类,因为它们设计糟糕,容易混淆和麻烦。

Instant now1 = Instant.now(); // Record, run again, compare.
String now1AsString = now1.toString();  // Ex: 2011-12-03T10:15:30.724Z
…
Instant now2 = Instant.now();  
Boolean timeWentBackwards = now2.isBefore( now1 );

当然你不能用这种技术来适应未来,只能过去。时钟总是朝着未来发展。

检测时钟骚扰的唯一可靠方法是使用多个时钟。您需要具有对受信任时钟的可信访问(连接),可能是网络上的时间服务器或Internet上的时间服务器。即使这样,只有一对时钟也很棘手。正如古老的海上谚语所说:“带上一个指南针,或三个。”。

DST滚动

检测DST更改应该是无关紧要的。处理日期时间的一般最佳做法是使用UTC。这包括您的大多数业务逻辑,数据存储和数据交换。

请记住:使用DST向前或向后滚动的时间毫无意义 - 时间继续流动,而不是扭曲,并且经过的秒数相同。