Millisecondes actuelles, de long à int
Actuellement j'ai le code suivant:
public static int currentTimeMillis()
{
long millisLong = System.currentTimeMillis();
while ( millisLong > Integer.MAX_VALUE )
{
millisLong -= Integer.MAX_VALUE;
}
return (int)millisLong;
}
qui renvoie l'heure courante dans un int
format (pas exactement, mais il peut être utilisé pour la différence de temps). Pour de très bonnes raisons, je ne peux pas utiliser long
.
Oui, je suis juste intéressé par la différence entre les deux appels, et cette approche fonctionne bien. Mais il semble tout à fait inacceptable. Je sais qu'. Et inefficaces. Je sais. Donc mes questions, comment puis-je l'améliorer?
J'ai besoin d'une fonction qui renvoie un int
tels que:
int x1 = currentTimeMillis(); //my function
long y1 = System.currentTimeMillis();
.....
int x2 = currentTimeMillis();
long y2 = System.currentTimeMillis();
//here, x2 - x1 must be equal to y2 - y1
EDIT:
Pour info, je veux faire cela pour l'analyse comparative. Je suis à l'exécution de tests sur plusieurs threads en parallèle, l'événement d'arrêt est déclenché par un composant externe. Je suis aussi la sérialisation des données d'une manière qui ne prend en charge int
et l'objet que je suis la sérialisation ne peut pas avoir long
membres.
source d'informationauteur Luchian Grigore
Vous devez vous connecter pour publier un commentaire.
Votre fonction fait essentiellement la même chose que:
Ci-dessus est probablement ce que vous cherchez. Le le module opérateur
%
renvoie le reste de la division. Je tiens seulement à l'envelopper dans une autre classe qui se cache cette distance. C'est à savoir déroutant d'avoir "heure actuelle dans millis" comme un int avec la bonne valeur. Quelque chose comme:avec
C'est aussi beaucoup mieux pour éviter les problèmes lors de l'heure de départ est à moins de
Integer.MAX_VALUE
et l'heure de fin est plus importante queInteger.MAX_VALUE
qui donc déborde de retour àInteger.MIN_VALUE
et continue à partir de là.Au lieu de trouver un module, une beaucoup plus rapide solution serait une simple opération de bits du masque de fonctionnement:
Être conscient que si l'
currentTimeMillis
valeur survole leInteger.MAX_VALUE
entre la prise dex1
etx2
vous allez vous retrouver avecx2 - x1
être une valeur négative. Il y a deux façons d'aborder cette question.x2 - x1
vérifier pour voir si elle est négative. Si elle l'est, ajouterInteger.MAX_VALUE
à nouveau. (Cela suppose qu'aucun des deux valeurs de temps sera vérifié que sont, en réalité, plus queInteger.MAX_VALUE
distance d'intervalle).Integer.MAX_VALUE
marque.Comme une note de côté, je suis sûr que nous nous demandons tous ce que votre très bonne raison pour ne pas utiliser
long
valeurs?Vous ne serez pas en mesure de satisfaire votre condition 100% du temps parce que le temps peut s'écouler entre les lignes de votre programme en cours d'exécution qui permettra de jeter les choses légèrement. Mais les chiffres ne vont pas être désactivé par beaucoup. Sans en savoir plus au sujet de votre problème, je suppose que vous n'êtes pas intéressé dans le temps réel. Peut-être vous êtes simplement intéressé au temps écoulé? Etes-vous certains de repères? Si le temps écoulé est tout ce dont vous avez besoin, le module de la solution proposée par @BalusC fera l'affaire.
Il vous suffit de faire
Si son négatif, il n'a pas d'importance pourvu qu'il y ait une différence. par exemple,
À l'aide de cette approche éviter le problème des débordements qu'elles seront éliminées par exemple