2

例如,我使用此代码来检查用户是否可以执行某些操作。所以用户每5秒只能做一个动作。

if((System.currentTimeMillis() - lastTime) > 5000)
{
    // Message: Ok, you can do action now.
}else{
    // Message: Have to wait 5 seconds to do action.
    return;
}

lastTime = System.currentTimeMillis();

但是众所周知,System.currentTimeMillis()返回一个long,并且那个long可以不断增加,直到它变成负数。

我的代码应该在需要超过 1 个月正常运行时间的服务器上运行。所以我担心在某些时候System.currentTimeMillis()会返回一个负值,我的代码总是会告诉用户他需要等待 5 秒或相反。

我真的很难专注于这段代码并修复它,所以我问你们是否有关于如何解决这个问题并使我的代码 100% 安全的提示。

4

6 回答 6

7

别担心。

你知道是谁的问题吗?

需要在Sun Aug 17 03:12:55 GMT-04:00 292278994更新它的人。

于 2011-09-09T15:52:03.920 回答
1

以毫秒为单位的 long 可以表示 292 277 266 年。我不确定这是你需要担心的事情。

于 2011-09-09T15:52:12.640 回答
1

根据这个线程,它将在292278994年溢出。我会说这是足够的时间:)

于 2011-09-09T15:52:35.117 回答
0

System.currentTimeMillis() 返回当前时间和 UTC 1970 年 1 月 1 日午夜之间的时间(以毫秒为单位)。可以表示为 long 的最大最大值是 9,223,372,036,854,775,807,如果我的计算是正确的(long max / (1000 * 3600 * 24 * 365)),那可能会超过 292471208 年。如果你的程序能够存活那么久,让那些将在多年后出生的人像我们为千年虫所做的那样担心它。

于 2011-09-09T16:02:36.313 回答
0

正如每个人所说,不要担心,但为了将来参考,也许你更愿意使用Joda-Time来问这种问题。

import org.joda.time.DateTime;

if(lastTime.plusSeconds(5).isAfterNow()) {
    // Message: Ok, you can do action now.
}
else {
    // Message: Have to wait 5 seconds to do action.
    return;
}

lastTime = new DateTime();
于 2011-09-09T16:04:23.620 回答
0

尽管正如其他人所说,它将溢出的时间很远很远。那时它甚至不会成为问题,因为您要获得两倍的差额。例如,假设您选择 292,278,994 年和 292,278,995 年(这似乎是负数),差异只有 1 年(正数)例如,如果您选择

long overflowYear = Long.MIN_VALUE; // overvflow of Long.MAX_VALUE + 1
long okayYear = Long.MAX_VALUE;
// time = 1 (positive due to an underflow!)
long time = overflowYear - okayYear; 

System.nanoTime() 可能会发生这种情况,因为它没有定义的开始时间,并且速度快了一百万倍。但是,只要您考虑时差,只要它们相隔不到 292 年,它是负数还是正数都没有关系。

因此,在回答您的问题时,即使在 292,278,994 年之后,您也不会遇到问题,直到应用程序在两次调用 System.currentTimeMillis() 之间运行超过 292,278,994 年!

于 2011-09-09T16:14:06.897 回答