Pregunta

Utilizo, por ejemplo, este código para verificar si el usuario puede hacer alguna acción. Entonces el usuario solo puede hacer una acción cada 5 segundos.

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();

Pero como todos sabemos, System.currentTimeMillis() Devuelve un largo, y ese largo puede seguir aumentando hasta que se vuelve negativo.

Mi código debe ejecutarse en un servidor que necesita tener más de 1 mes de tiempo de actividad. Así que me temo en algún momento System.currentTimeMillis() devolverá un valor negativo y mi código siempre le dirá al usuario que necesita esperar 5 segundos o lo contrario.

Estoy pasando muy mal para concentrarme en este código y solucionarlo, así que les pregunto si tienen un consejo sobre cómo solucionar este problema y hacer que mi código sea 100% seguro.

¿Fue útil?

Solución

No te preocupes por eso.

¿Sabes quién es el problema?

El tipo que necesitará actualizarlo en Sol 17 de agosto 03:12:55 GMT-04: 00 292278994.

Otros consejos

Un largo milisegundos puede representar 292 277 266 años. No estoy seguro de que este sea el tipo de cosas que debes preocuparte.

De acuerdo a este hilo, se desbordará en el año 292278994. Diré que es mucho tiempo :)

Como todos han dicho, no se preocupe por eso, pero por referencia futura, tal vez prefiera usar Joda-tiempo Para hacer este tipo de pregunta.

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 () devuelve el tiempo en milisegundos, entre la hora actual y la medianoche, 1 de enero de 1970 UTC. Con el valor máximo más grande que se puede representar como un largo es 9,223,372,036,854,775,807, si mi cálculo es correcto (largo max / (1000 * 3600 * 24 * 365)), eso podría subir a más de 292471208 años. Si su programa puede sobrevivir tanto tiempo, deje que alguien que nazca tantos años más tarde se preocupe por eso como lo hicimos por Y2K.

A pesar de que el tiempo que se desbordará está muy lejos, en el futuro, como otros han declarado. Ni siquiera será un problema entonces porque está tomando la diferencia de dos veces. por ejemplo, digamos que toma el año 292,278,994 y el año 292,278,995 (que parece ser negativo), la diferencia es solo 1 año (un número positivo) si toma

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; 

Esto podría suceder con System.Nanotime (), ya que no tiene un tiempo de inicio definido y marca un millón de tiempo más rápido. Sin embargo, siempre que tome la diferencia de tiempo, no importa si uno es negativo o positivo siempre que tenga menos de 292 años de diferencia.

Entonces, en respuesta a su pregunta, incluso después del año 292,278,994, no tendrá un problema hasta que la aplicación se haya ejecutado durante más de 292,278,994 años entre llamadas a System.CurrentTimemillis ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top