我使用例如此代码来检查用户是否可以执行某些操作。因此,用户每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()
会返回一个长整数,并且该长期可以继续增加,直到它变为否定为止。
我的代码应该在需要超过1个月正常运行时间的服务器上运行。所以我担心在某些时候System.currentTimeMillis()
将返回一个否定值,我的代码将始终告诉用户他需要等待5秒或相反。
我真的很难专注于这段代码并修复它,所以我问你们,如果你有关于如何解决这个问题的提示并使我的代码100%安全。
答案 0 :(得分:7)
答案 1 :(得分:1)
A long in milliseconds can represent 292 277 266 years。我不确定这是你需要担心的事情。
答案 2 :(得分:1)
根据this帖子,它将在年份 292278994 中溢出。我会说这是充足的时间:))
答案 3 :(得分:0)
System.currentTimeMillis()返回当前时间与UTC时间1970年1月1日午夜之间的时间(以毫秒为单位)。如果我的计算结果正确(长期最大/(1000 * 3600 * 24 * 365)),那么可以表示为long的最大最大值为9,223,372,036,854,775,807,这可能会超过292471208年份。如果你的程序可以存活那么久,那么多年后出生的人会像我们为Y2K所做的那样担心它。
答案 4 :(得分: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();
答案 5 :(得分: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年之前,您也不会遇到任何问题!