как управлять временем, оставшимся с System.currentTimeMillis () - PullRequest
2 голосов
/ 09 сентября 2011

Я использую, например, этот код, чтобы проверить, может ли пользователь выполнить какое-либо действие.Таким образом, пользователь может выполнять только одно действие каждые 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% безопасным.

Ответы [ 6 ]

7 голосов
/ 09 сентября 2011

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

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

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

1 голос
/ 09 сентября 2011

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

1 голос
/ 09 сентября 2011

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

0 голосов
/ 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 ()!

0 голосов
/ 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();
0 голосов
/ 09 сентября 2011

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

...