我是java的初学者。我已经创建了一个用于跟踪工作时间的应用程序
有两个功能:1.开始时间和2.停止时间,当用户我必须计算该时间并给出该时间之间的差值并将其存储时。
我尝试了所有的搜索引擎,但我找不到合适的词来找到它
但问题是,如果用户启动计时器,然后更改系统时间更新更多的时间,那么我的输出是错误的
现在我该怎么解决这个问题呢?有没有办法检测系统时间的变化?
发布于 2014-03-28 18:18:31
您可以使用google-guava库类
示例
Stopwatch s = new Stopwatch().start();
...
long passedMillis = s.stop().elapsedMillis();如果用户更改系统时间,则按预期工作。
Maven依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>11.0.2</version>
<type>jar</type>
</dependency> 或者,您可以使用apache-commons库类 example
StopWatch s = new StopWatch();
s.start();
...
s.stop();
long passedMillis = s.getTime(); Maven依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>发布于 2014-03-28 19:46:40
您有两个选项来解决您的问题:
1)防止系统时间更改:
如果计算机是由系统管理员控制的公司计算机,并且用户没有管理员权限,则这很容易实现。由于更改时间需要一些高级用户权限,因此用户将无法更改系统时间。在你的计算中,可以考虑“官方”的时间变化,因为它是计划的,并且知道什么时候发生。
2)监控系统时间:您可以通过让线程将系统时间与之前读取的系统时间进行比较来监控系统时间的变化。如果突然出现意想不到的变化,您可以检测到用户在作弊。
在同一线程中,您可以使用某种"ellapsed time“计数器,该计数器每秒钟更新一个计数器。这样,无论用户是否更改时间,您都将更新您的"ellapsed time counter“,并使用它来计算任务持续时间而不是系统时间。
发布于 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中
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可能会有所帮助。
https://stackoverflow.com/questions/22709656
复制相似问题