繁体   English   中英

如何使用System.currentTimeMillis()管理剩余的时间

[英]how to manage the time left with System.currentTimeMillis()

我使用例如此代码来检查用户是否可以执行某些操作。 因此,用户每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可以继续增加直到它变为negativ ..

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

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

别担心。

你知道这是什么问题吗?

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

很长的毫秒可以代表292 277 266年 我不确定这是你需要担心的事情。

根据这个帖子,它将在292278994年溢出。 我会说这是充足的时间:)

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

正如大家所说,不要担心它,但为了将来参考,你可能更愿意使用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();

即使其溢出的时间远远超出其他人的说法。 它甚至不会成为一个问题,因为你正在采取两次差异。 例如,假设您选择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年之前,您也不会遇到任何问题!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM