Je veux enregistrer le temps en utilisant System.currentTimeMillis()
quand un utilisateur commence quelque chose dans mon programme. Quand il aura fini, je soustrais le courant System.currentTimeMillis()
de la start
variable, et je veux leur montrer le temps écoulé en utilisant un format lisible par l'homme tel que "XX heures, XX minutes, XX secondes" ou même "XX minutes, XX secondes" car son pas susceptible de prendre quelqu'un une heure.
Quelle est la meilleure façon de procéder?
Réponses:
Utilisez la
java.util.concurrent.TimeUnit
classe:Remarque:
TimeUnit
fait partie de la spécification Java 1.5, mais atoMinutes
été ajoutée à partir de Java 1.6.Pour ajouter un zéro non significatif pour les valeurs 0-9, faites simplement:
Si
TimeUnit
ou netoMinutes
sont pas pris en charge (comme sur Android avant l'API version 9), utilisez les équations suivantes:la source
int hours = (int) ((milliseconds / (1000*60*60)) % 24)
ça ne marche pas! au lieu de cela, cela devrait être comme çaint hours = (int) (milliseconds / (1000*60*60)) ;
String.format("%01d:%02d:%02d", hours, minutes, seconds);
Sur la base de la réponse de @ siddhadev, j'ai écrit une fonction qui convertit les millisecondes en une chaîne formatée:
la source
1 Days 1 Hours 1 Minutes 1 Seconds
long days = TimeUnit.MILLISECONDS.toDays(millis);
long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24;
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
long milliseconds = millis % 1000;
ainsi que la méthode String.format:return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds", days, hours, minutes, seconds, milliseconds);
Tirages:
la source
Duration dur = new Duration(start, end);
long millis = dur.getMillis();
DateTimeFormat.forPattern("mm:ss:SSS").print(new DateTime(time));
ou convertissez la durée en une période qui peut être automatiquement imprimée à l'aide d'un JodaPeriodFormatter
. La conversion pourrait avoir une perte de précision si autre que la chronologie ISO. Supposons une durée représentée par la variableduration
.Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
PeriodFormat.getDefault().print(period))
La sortie est impressionnante: 1 seconde et 581 millisecondes, répondant à la question principale ci-dessus.Uhm ... combien de millisecondes sont en une seconde? Et dans une minute? La division n'est pas si difficile.
Continuez comme ça pendant des heures, des jours, des semaines, des mois, des années, des décennies, peu importe.
la source
Utilisation du package java.time dans Java 8:
La sortie est au format de durée ISO 8601 :
PT1M3.553S
(1 minute et 3,553 secondes).la source
Je ne tirerais pas la dépendance supplémentaire juste pour cela (la division n'est pas si difficile, après tout), mais si vous utilisez Commons Lang de toute façon, il y a le DurationFormatUtils .
Exemple d'utilisation (adapté d' ici ):
Exemple:
Remarque : Pour obtenir des millis de deux objets LocalDateTime, vous pouvez utiliser:
la source
Vous pouvez soit répartir les divisions, soit utiliser l' API SimpleDateFormat .
Edit by Bombe : Il a été montré dans les commentaires que cette approche ne fonctionne que pour des durées plus petites (c'est-à-dire moins d'une journée).
la source
Juste pour ajouter plus d'informations si vous souhaitez formater comme: HH: mm: ss
0 <= HH <= infini
0 <= mm <60
0 <= ss <60
utilisez ceci:
Je viens d'avoir ce problème maintenant et je l'ai compris
la source
Je pense que la meilleure façon est:
la source
Solution la plus courte:
Voici probablement le plus court qui traite également des fuseaux horaires.
Quelles sorties par exemple:
Explication:
%tT
est l'heure au format 24 heures%tH:%tM:%tS
.%tT
accepte également les longs comme entrée, donc pas besoin de créer unDate
.printf()
affichera simplement l'heure spécifiée en millisecondes, mais dans le fuseau horaire actuel, nous devons donc soustraire le décalage brut du fuseau horaire actuel afin que 0 millisecondes soit 0 heure et non la valeur de décalage horaire du fuseau horaire actuel.Note # 1: Si vous avez besoin du résultat en tant que
String
, vous pouvez l'obtenir comme ceci:Remarque n ° 2: cela ne donne un résultat correct que s'il
millis
est inférieur à un jour car la partie jour n'est pas incluse dans la sortie.la source
long millis = 8398;
et quand je passe ça àString.format("%tT", millis)
ma sortie c'est 19:00:08. D'où vient le 19?TimeZone.getDefault().getRawOffset()
, exactement comme écrit dans la réponse:String.format("%tT", millis-TimeZone.getDefault().getRawOffset())
Joda-Time
Utilisation de Joda-Time :
la source
PeriodFormat
dans la dernière ligne. Appelez simplementPeriod::toString
pour obtenir une durée ISO 8601 chaîne de par défaut.Revisitant la contribution de @ brent-nash, nous pourrions utiliser la fonction module au lieu de soustractions et utiliser la méthode String.format pour la chaîne de résultat:
la source
pour Android sous API 9
la source
Pour les petits temps, moins d'une heure, je préfère:
pour des intervalles plus longs:
la source
%tH
ne montre que de 0 à 23 heures? Cela signifie que, par exemple, 24 heures seront affichées comme00
, 25 heures comme01
... même valable pour%tT
- jours seront ignorées en silence. Bien sûr, il pourrait également y avoir des jours affichés, mais ce serait une exagération pour le problème que j'ai eu quand j'ai écrit ceci (en 2011) [:-)Mon calcul simple:
Bon codage :)
la source
Voici une réponse basée sur la réponse de Brent Nash, espérons que cela aide!
la source
la source
diff=diff-(hours*60*1000);
devrait êtrediff=diff-(hours*60*60*1000);
. J'ai essayé de le modifier, mais la politique de modification agaçante de StackOverflow dit que ce n'est pas assez de caractères pour une modification.Premièrement,
System.currentTimeMillis()
etInstant.now()
ne sont pas idéales pour le chronométrage. Ils signalent tous deux l'heure de l'horloge murale, que l'ordinateur ne connaît pas précisément, et qui peut se déplacer de manière irrégulière, y compris en reculant si, par exemple, le démon NTP corrige l'heure du système. Si votre chronométrage se produit sur une seule machine, vous devez plutôt utiliser System.nanoTime () .Deuxièmement, à partir de Java 8, java.time.Duration est le meilleur moyen de représenter une durée:
la source
Si vous savez que le décalage horaire serait inférieur à une heure, vous pouvez utiliser le code suivant:
Il en résultera: 51:00
la source
Cette réponse est similaire à certaines réponses ci-dessus. Cependant, je pense que ce serait bénéfique parce que, contrairement aux autres réponses, cela supprimera toutes les virgules ou espaces et gèrera les abréviations.
la source
Il ya un problème. Lorsque les millisecondes sont égales à 59999, elles durent en réalité 1 minute, mais elles seront calculées en 59 secondes et 999 millisecondes seront perdues.
Voici une version modifiée basée sur les réponses précédentes, qui peut résoudre cette perte:
la source
C'est plus simple en Java 9:
Cela produit une chaîne comme
0 hours, 39 mins, 9 seconds
.Si vous souhaitez arrondir à des secondes entières avant de formater:
Pour supprimer les heures si elles sont égales à 0:
Maintenant on peut avoir par exemple
39 mins, 9 seconds
.Pour imprimer les minutes et les secondes avec un zéro devant pour les faire toujours deux chiffres, il suffit d'insérer
02
dans les spécificateurs de format appropriés, ainsi:Maintenant, nous pouvons avoir par exemple
0 hours, 39 mins, 09 seconds
.la source
if
-else
là.pour les chaînes correctes ("1 heure, 3 sec", "3 min" mais pas "0 heure, 0 min, 3 sec") j'écris ce code:
la source
J'ai modifié la réponse de @MyKuLLSKI et ajouté le support de la plurlisation. J'ai pris quelques secondes car je n'en avais pas besoin, mais n'hésitez pas à le rajouter si vous en avez besoin.
la source
int intervalMins
vslong millis
J'ai couvert cela dans une autre réponse mais vous pouvez le faire:
La sortie est quelque chose comme
Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
, avec les unités commandées.C'est à vous de comprendre comment internationaliser ces données en fonction des paramètres régionaux cibles.
la source
Utilisez java.util.concurrent.TimeUnit et utilisez cette méthode simple:
Par exemple:
la source
DurationFormatUtils.formatDurationHMS (long)
la source