首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何跟踪系统时钟

如何跟踪系统时钟
EN

Stack Overflow用户
提问于 2014-03-28 18:06:38
回答 3查看 196关注 0票数 4

我是java的初学者。我已经创建了一个用于跟踪工作时间的应用程序

有两个功能:1.开始时间和2.停止时间,当用户我必须计算该时间并给出该时间之间的差值并将其存储时。

我尝试了所有的搜索引擎,但我找不到合适的词来找到它

但问题是,如果用户启动计时器,然后更改系统时间更新更多的时间,那么我的输出是错误的

现在我该怎么解决这个问题呢?有没有办法检测系统时间的变化?

EN

回答 3

Stack Overflow用户

发布于 2014-03-28 18:18:31

您可以使用google-guava库类

示例

代码语言:javascript
复制
Stopwatch s = new Stopwatch().start();  
...
long passedMillis = s.stop().elapsedMillis();

如果用户更改系统时间,则按预期工作。

Maven依赖

代码语言:javascript
复制
  <dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>11.0.2</version>
     <type>jar</type>
  </dependency>    

或者,您可以使用apache-commons库类 example

代码语言:javascript
复制
  StopWatch s = new StopWatch();
  s.start();
  ...
  s.stop();
  long passedMillis = s.getTime();  

Maven依赖

代码语言:javascript
复制
  <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-lang3</artifactId>
     <version>3.1</version>
  </dependency>
票数 0
EN

Stack Overflow用户

发布于 2014-03-28 19:46:40

您有两个选项来解决您的问题:

1)防止系统时间更改:

如果计算机是由系统管理员控制的公司计算机,并且用户没有管理员权限,则这很容易实现。由于更改时间需要一些高级用户权限,因此用户将无法更改系统时间。在你的计算中,可以考虑“官方”的时间变化,因为它是计划的,并且知道什么时候发生。

2)监控系统时间:您可以通过让线程将系统时间与之前读取的系统时间进行比较来监控系统时间的变化。如果突然出现意想不到的变化,您可以检测到用户在作弊。

在同一线程中,您可以使用某种"ellapsed time“计数器,该计数器每秒钟更新一个计数器。这样,无论用户是否更改时间,您都将更新您的"ellapsed time counter“,并使用它来计算任务持续时间而不是系统时间。

票数 0
EN

Stack Overflow用户

发布于 2014-03-28 20:36:40

,但问题是,如果用户启动计时器,然后更改系统时间更新更多的时间,那么我的输出是错误的。

在linux下,使用System.getNanoTime()是安全的,因为它使用CLOCK_MONOTONIC作为时钟源。只有当系统没有在开始时间和结束时间之间重新启动时,这才能起作用。

CLOCK_MONOTONIC是不能更改的时钟源。当系统启动时,它被初始化为任意值。这个时钟只会以恒定的方式递增。没有跳跃。它对测量时间非常有用,因为它独立于系统的挂壁时间(您在pc时钟上看到的时间),并且非常准确。

我刚刚看了一下openjdk-7-b147的源代码。

hotspot\src\os\linux\vm\os_linux.cpp

代码语言:javascript
复制
jlong os::javaTimeNanos() {
  if (Linux::supports_monotonic_clock()) {
    struct timespec tp;
    int status = Linux::clock_gettime(CLOCK_MONOTONIC, &tp);
    assert(status == 0, "gettime error");
    jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
    return result;
  } else {
    timeval time;
    int status = gettimeofday(&time, NULL);
    assert(status != -1, "linux error");
    jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
    return 1000 * usecs;
  }
}

clock_gettime man-page

CLOCK_MONOTONIC

不能设置的时钟,表示从某个未指定的起始点开始的单调时间。

我不知道它在windows上是如何工作的,但我猜使用的时钟源也不依赖于挂钟。

This blog post可能会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22709656

复制
相关文章

相似问题

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