Question

J'utilise par exemple ce code pour vérifier si l'utilisateur peut faire une action.L'utilisateur ne peut donc effectuer qu'une seule action toutes les 5 secondes.

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

Mais comme nous le savons tous, System.currentTimeMillis() renvoie un long, et ce long peut continuer à augmenter jusqu'à ce qu'il devienne négatif.

Mon code doit s'exécuter sur un serveur qui doit avoir plus d'un mois de disponibilité.J'ai donc peur qu'à un moment donné, System.currentTimeMillis() renvoie une valeur négative et mon code dira toujours à l'utilisateur qu'il doit attendre 5 secondes ou l'inverse.

J'ai vraiment du mal à me concentrer sur ce morceau de code et à le réparer, alors je vous demande si vous avez un conseil sur la façon de résoudre ce problème et de rendre mon code 100% sûr.

Était-ce utile?

La solution

Ne vous en faites pas.

Vous savez à qui est le problème?

Le type qui devra le mettre à jour le dim 17 août 03:12:55 GMT-04:00 292278994 .

Autres conseils

Un long en millisecondes peut représenter 292 277 266 années .Je ne suis pas sûr que ce soit le genre de chose dont vous devez vous inquiéter.

Selon ce fil de discussion, il débordera dans l'année 292278994 .Je dirai que c'est beaucoup de temps :)

Comme tout le monde l'a dit, ne vous inquiétez pas, mais pour référence future, vous préféreriez peut-être utiliser Joda-Il est temps de poser ce genre de question.

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 () renvoie l'heure en millisecondes, entre l'heure actuelle et minuit, le 1er janvier 1970 UTC.La valeur maximale la plus élevée pouvant être représentée sous la forme d'une longueur est de 9 223 372 036 854 775 807, si mon calcul est correct ( long max / (1000 * 3600 * 24 * 365) ), cela pourrait aller jusqu'à plus de 292471208ans.Si votre programme peut survivre aussi longtemps, laissez quelqu'un qui naîtra plusieurs années plus tard s'en inquiéter comme nous l'avons fait pour l'an 2000.

Même si le temps où il débordera est loin, très loin dans le futur comme d'autres l'ont dit.Ce ne sera même pas un problème alors parce que vous prenez la différence de deux fois.par exemple.disons que vous prenez l'année 292,278,994 et l'année 292,278,995 (qui semblerait être négative), la différence n'est que de 1 an (un nombre positif) par ex.si vous prenez

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; 

Ce genre de chose pourrait se produire avec System.nanoTime () car il n'a pas d'heure de début définie et il est un million de fois plus rapide.Cependant, tant que vous prenez le décalage horaire, peu importe si l'un est négatif ou positif, à condition qu'il y ait moins de 292 ans d'intervalle.

Donc, en réponse à votre question, même après l'année 292 278 994, vous n'aurez pas de problème tant que l'application n'aura pas fonctionné depuis plus de 292 278 994 ans entre les appels à System.currentTimeMillis ()!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top