как управлять оставшимся временем с помощью 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() возвращает длинное число, и оно может увеличиваться, пока не станет отрицательным.

Мой код должен работать на сервере, который должен работать более 1 месяца. Поэтому я боюсь, что в какой-то момент System.currentTimeMillis() вернет отрицательное значение, и мой код всегда будет сообщать пользователю, что ему нужно подождать 5 секунд или наоборот.

Мне очень трудно сосредоточиться на этом фрагменте кода и исправить его, поэтому я прошу вас, ребята, есть ли у вас совет, как исправить эту проблему и сделать мой код на 100% безопасным.


person Reacen    schedule 09.09.2011    source источник
comment
Вы видели когда становится отрицательным?   -  person Thorbjørn Ravn Andersen    schedule 09.09.2011


Ответы (6)


Не беспокойся об этом.

Вы знаете, чья это проблема?

Парень, которому нужно будет обновить его Вс, 17 августа, 03:12:55 GMT-04: 00 292278994.

person Andrew    schedule 09.09.2011
comment
Типичный ленивый менталитет ... оставьте проблему для нашего будущего сверхразумного поколения, гибрид инопланетян. Y2G будет массовой хитерией! - person Java Drinker; 09.09.2011
comment
+1: Динозавры вместе прожили 180 миллионов лет. К тому времени мы либо эволюционируем, либо вымрем. ;) - person Peter Lawrey; 09.09.2011
comment
Я не верю, что Java скоро вымрет, но я надеюсь, что люди проживут дольше, чем Java. - person Peter Lawrey; 09.09.2011
comment
Даже после 292278994 года это не будет проблемой, если разница между временами будет меньше 292278994 лет (см. Мой ответ) - person Peter Lawrey; 09.09.2011

Долгое время в миллисекундах может представлять 292 277 266 лет. Я не уверен, что вам стоит беспокоиться об этом.

person Java Drinker    schedule 09.09.2011

Согласно этому потоку, он переполнится через 292278994 года. . Скажу, что времени много :)

person Petar Minchev    schedule 09.09.2011

Как все уже говорили, не беспокойтесь об этом, но для справки в будущем, возможно, вы предпочтете использовать 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();
person andeyatz    schedule 09.09.2011
comment
Спасибо, но это медленнее .. Я думаю, что мой способ быстрее при работе на 64-битной машине - person Reacen; 09.09.2011
comment
В этом случае инвертируйте операцию и создайте lastTime var плюс 5 секунд. Я не вижу, чтобы это слишком сильно замедляло вас, независимо от того, на какой архитектуре машины вы находитесь - person andeyatz; 12.09.2011

System.currentTimeMillis () возвращает время в миллисекундах между текущим временем и полуночью 1 января 1970 г. по всемирному координированному времени. При наибольшем максимальном значении, которое может быть представлено как длинное, 9 223 372 036 854 775 807, если мои расчеты верны (long max / (1000 * 3600 * 24 * 365)), оно может увеличиться до более чем 292471208. годы. Если ваша программа может продержаться так долго, позвольте тому, кто родится так много лет спустя, беспокоиться об этом, как мы это сделали в отношении проблемы 2000 года.

person Kevin Le - Khnle    schedule 09.09.2011

Несмотря на то, что время, когда оно переполнится, будет далеко, далеко в будущем, как утверждали другие. Тогда это даже не будет проблемой, потому что вы берете разницу в два раза. например скажем, вы берете год 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 года у вас не будет проблем, пока приложение не проработает более 292 278 994 лет между вызовами System.currentTimeMillis ()!

person Peter Lawrey    schedule 09.09.2011