system.currenttimemillis()で残っている時間を管理する方法
-
28-10-2019 - |
質問
たとえば、このコードを使用して、ユーザーがアクションを実行できるかどうかを確認します。したがって、ユーザーは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()
長く戻り、それが否定的になるまで長い間増加し続けることができます。
私のコードは、1か月以上の稼働時間が必要なサーバーで実行されるはずです。だから私はある時点で恐れています System.currentTimeMillis()
Negativ値を返すと、私のコードは常にユーザーに5秒待つ必要があるか、反対を待つ必要があることを伝えます。
このコードに集中して修正するのに本当に苦労しているので、この問題を修正してコードを100%安全にする方法についてのヒントがあるかどうかを皆さんに尋ねています。
解決
他のヒント
長いミリ秒は292 277 266年を表すことができます. 。これがあなたが心配する必要があるようなものであるかどうかはわかりません。
によると これ スレッド、それは年にオーバーフローします 292278994. 。私はそれが十分な時間だと言うでしょう:)
誰もが言ったように、それについて心配しないでくださいが、将来の参照のためにあなたは使用したいと思うでしょう ジョーダタイム この種の質問をする。
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();
System.CurrentTimemillis()は、1970年1月1日の現在の時間と真夜中の間に、ミリ秒単位で時間を返します。私の計算が正しい場合、長いと表現できる最大値は9,223,372,036,854,775,807です(9,223,372,036,854,775,807long max /(1000 * 3600 * 24 * 365))、それは292471208年以上になる可能性があります。あなたのプログラムがそれほど長く生き残ることができれば、それから生まれた人が私たちがY2Kでやったようにそれを心配させてください。
他の人が述べているように、それがオーバーフローする時間ははるかに遠く、将来に至るまでです。あなたが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年以上にわたってアプリケーションが実行されるまで問題は発生しません!