Je suis confus. Après être tombé sur ce fil, j'ai essayé de comprendre comment formater un compte à rebours qui avait le format hh:mm:ss
.
Voici ma tentative -
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
Donc, quand j'essaie une valeur comme 3600000ms
, j'obtiens 01:59:00
, ce qui est faux car il devrait l'être 01:00:00
. Il y a évidemment quelque chose qui cloche dans ma logique, mais pour le moment, je ne vois pas ce que c'est!
Quelqu'un peut-il aider?
Éditer -
Corrigé. Voici la bonne façon de formater les millisecondes pour hh:mm:ss
formater -
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
Le problème était le suivant TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
. Cela aurait dû être ça à la TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
place.
00:59:59
, ça devrait l'être01:00:00
.Réponses:
Vous étiez vraiment proche:
Vous convertissiez des heures en millissecondes en utilisant des minutes au lieu d' heures .
BTW, j'aime votre utilisation de l'
TimeUnit
API :)Voici un code de test:
Production:
J'ai réalisé que mon code ci-dessus peut être grandement simplifié en utilisant une division de module au lieu d'une soustraction:
Toujours en utilisant l'
TimeUnit
API pour toutes les valeurs magiques, et donne exactement le même résultat.la source
.replaceAll("^00:", "")
ou.replaceAll("^00:(00:)?", "")
supprime des minutes ainsi que des heures si les deux sont à zéro."15:00"
et"10:00:23"
respectivement; seuls les zéros non significatifs sont supprimés, car la correspondance est ancrée au début de l'entrée par^
.La méthode générique pour cela est assez simple:
la source
String.format("%
02d:%02d:%02d", h,m,s)
?Si vous utilisez apache commons:
la source
DurationFormatUtils.formatDurationHMS(timeInMS);
J'ai utilisé ceci:
Voir la description de la classe Formatter .
Voir l' exemple exécutable avec une entrée de 2400 ms.
la source
String.format()
fuseau horaire . La bonne réponse idéale, cependant, doit être indépendante du fuseau horaire .String.format()
fuseau horaire . La bonne réponse idéale, cependant, doit être indépendante du fuseau horaire .Voir l' exemple exécutable en utilisant une entrée de 1200 ms.
la source
la source
Résultats des tests pour les 4 implémentations
Devoir faire beaucoup de formatage pour des données énormes, il fallait les meilleures performances, voici donc les résultats (surprenants):
pour (int i = 0; i <1000000; i ++) {FUNCTION_CALL}
Durées:
formatTimeUnit: 2216 millis
la source
StringBuilder
puis faites l'erreur d'utiliser "0" + nombre de type "ruine". Le GC de @mre JVM est extrêmement bon pour allouer et collecter de nombreux objets de courte durée, pas de souci. Je suis alléString.format
sans logique de tête zéro à gérer.cela a fonctionné pour moi, avec kotlin
la source
En suivant la réponse de Bohemian, nous n'avons pas besoin d'utiliser TimeUnit pour trouver une valeur connue. Un code beaucoup plus optimal serait
J'espère que ça aide
la source
millisLeft%1000/10
pour que nous obtenions le formathour:minutes:seconds:milliseconds
millisLeft%1000
la source
Java 9
Cela imprime:
Vous faites bien en laissant les méthodes de bibliothèque effectuer les conversions impliquées pour vous.
java.time
, l'API de date et d'heure Java moderne, ou plus précisément, saDuration
classe le fait de manière plus élégante et moins sujette aux erreurs queTimeUnit
.Les méthodes
toMinutesPart
et quetoSecondsPart
j'ai utilisées ont été introduites dans Java 9.Java 6, 7 et 8
La sortie est la même que ci-dessus.
Question: Comment cela peut-il fonctionner dans Java 6 et 7?
java.time
est intégré.org.threeten.bp
sous-packages.Liens
java.time
.java.time
été décrit pour la première fois.java.time
vers Java 6 et 7 (ThreeTen pour JSR-310).la source
Le code ci-dessous effectue la conversion dans les deux sens
23: 59: 58: 999 à 86398999
et que
86398999 à 23: 59: 58: 999
la source
Format: 00: 00: 00.000
Exemple: 615605 Millisecend
00: 10: 15.605
la source
La réponse marquée comme correcte comporte une petite erreur,
par exemple ceci est un exemple de la valeur que j'obtiens:
Voici la solution pour obtenir le bon format:
obtenir en conséquence un format correct:
une autre option pour obtenir le format
hh:mm:ss
est simplement:la source
J'ai essayé comme indiqué dans la première réponse. Cela fonctionne, mais moins m'a mis dans la confusion. Ma réponse par Groovy:
la source
Pour Kotlin
où,
milSecs
est en millisecondesla source
Eh bien, vous pouvez essayer quelque chose comme ça:
pour convertir des millisecondes en une valeur de temps
la source