2

たとえば、このコードを使用して、ユーザーが何らかのアクションを実行できるかどうかを確認します。したがって、ユーザーは 5 秒ごとに 1 つのアクションしか実行できません。

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

他の人が述べているように、それが溢れる時は遠い未来です。2倍の差をとっているので、それでも問題ありません。たとえば、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() には定義された開始時間がなく、100 万倍速く刻むため、この種のことが発生する可能性があります。ただし、時差をとっている限り、292 年以内であれば、どちらが負であるか正であるかは関係ありません。

したがって、あなたの質問への回答として、292,278,994 年以降でも、アプリケーションが System.currentTimeMillis() の呼び出しの間に 292,278,994 年以上実行されるまで問題は発生しません。

于 2011-09-09T16:14:06.897 に答える
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

System.currentTimeMillis() は、現在時刻から 1970 年 1 月 1 日 UTC の午前 0 時までの時間をミリ秒単位で返します。long として表すことができる最大の最大値は 9,223,372,036,854,775,807 で、計算が正しければ ( long max / (1000 * 3600 * 24 * 365) )、292471208 年以上になる可能性があります。あなたのプログラムがそれだけ長く生き残ることができるなら、2000年問題のときのように、その何年も後に生まれる誰かに心配させてください.

于 2011-09-09T16:02:36.313 に答える