221 votes

Comment convertir les millisecondes au format "hh:mm:ss" ?

Je suis confus. Après être tombé sur este j'ai essayé de comprendre comment formater un compte à rebours au format suivant 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)));   

Ainsi, lorsque j'essaie une valeur comme 3600000ms j'obtiens 01:59:00 ce qui est erroné puisque ce devrait être 01:00:00 . Il y a manifestement quelque chose qui cloche dans ma logique, mais pour l'instant, je ne vois pas ce que c'est !

Quelqu'un peut-il m'aider ?

Editer -

C'est réparé. Voici la bonne façon de formater les millisecondes en hh:mm:ss format -

//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)) . Ça aurait dû être ça TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)) à la place.

1 votes

3 600 000 millisecondes représentent 3 600 secondes, ou 60 minutes, ou 1 heure. Cela ne devrait pas être 00:59:59 il devrait l'être 01:00:00 .

410voto

Bohemian Points 134107

Vous étiez realmente proche :

String.format("%02d:%02d:%02d", 
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -  
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), // The change is in this line
TimeUnit.MILLISECONDS.toSeconds(millis) - 
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));   

Vous convertissiez les heures en millisecondes en utilisant minutes au lieu de heures .

BTW, j'aime votre utilisation de la TimeUnit API :)

Voici un code de test :

public static void main(String[] args) throws ParseException {
    long millis = 3600000;
    String hms = 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)));
    System.out.println(hms);
}

Sortie :

01:00:00

Je me suis rendu compte que mon code ci-dessus peut être grandement simplifié en utilisant une division modulaire au lieu d'une soustraction :

String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
    TimeUnit.MILLISECONDS.toMinutes(millis) % TimeUnit.HOURS.toMinutes(1),
    TimeUnit.MILLISECONDS.toSeconds(millis) % TimeUnit.MINUTES.toSeconds(1));

Toujours en utilisant le TimeUnit API pour toutes les valeurs magiques, et donne exactement le même résultat.

2 votes

Amen, j'aime la façon dont vous utilisez l'API TimeUnit :)

2 votes

Ce n'est pas une bonne idée de réinventer la roue ! La réponse de Triton Man est une meilleure solution.

6 votes

@ Mais l'autre réponse utilise une bibliothèque externe, alors que mon code n'utilise que le noyau du JDK. Cela dépend de vos besoins - par exemple, il se peut que vous ne puissiez pas utiliser une bibliothèque externe. L'autre réponse est cependant bonne.

94voto

Noetic Jun Points 638

La méthode générique pour cela est assez simple :

public static String convertSecondsToHMmSs(long seconds) {
    long s = seconds % 60;
    long m = (seconds / 60) % 60;
    long h = (seconds / (60 * 60)) % 24;
    return String.format("%d:%02d:%02d", h,m,s);
}

1 votes

@Javaman59, vouliez-vous dire String.format("% 02 d:%02d:%02d", h,m,s) ?

2 votes

@KarenAnne. Cela dépend si vous voulez, par exemple, "03:59:59" ou "3:59:59".

3 votes

Le temps est en millisecondes, il faut multiplier les secondes par 1000.

68voto

Triton Man Points 4920

Si vous utilisez apache commons :

DurationFormatUtils.formatDuration(timeInMS, "HH:mm:ss,SSS");

6 votes

Raccourci : DurationFormatUtils.formatDurationHMS(timeInMS);

0 votes

@Jorgesys Pourquoi sont-ils obsolètes ?

1 votes

Ils ne sont pas obsolètes.

28voto

Vinay Lodha Points 1382
// New date object from millis
Date date = new Date(millis);
// formattter 
SimpleDateFormat formatter= new SimpleDateFormat("HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
// Pass date object
String formatted = formatter.format(date );

Voir Exemple d'exécution en utilisant une entrée de 1200 ms.

3 votes

Cela produirait des résultats incorrects pour des durées supérieures à un jour. Elle ramènerait le nombre d'heures de 23 à 0, ce qui n'est probablement pas souhaitable ici.

0 votes

Non, mon pote... Je pense que cela fonctionnerait de la même manière. Essaie avec la date d'aujourd'hui.

1 votes

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa") ; au cas où quelqu'un voudrait le format 12 heures avec am/pm

15voto

DateFormat df = new SimpleDateFormat("HH:mm:ss");
String formatted = df.format(aDateObject);

1 votes

Même réponse que stackoverflow.com/questions/9027317/ avec le même problème pour une durée supérieure à 1 jour

0 votes

Il dépend également du fuseau horaire, ce qui signifie que le résultat sera différent s'il est exécuté dans des fuseaux horaires différents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X