202 votes

Comment formater une durée en java ? (par exemple, format H:MM:SS)

J'aimerais formater une durée en secondes en utilisant un modèle comme H:MM:SS. Les utilitaires actuels en Java sont conçus pour formater une heure mais pas une durée.

219voto

bobince Points 270740

Si vous ne voulez pas glisser dans les bibliothèques, il est assez simple de le faire vous-même en utilisant un formateur, ou un raccourci connexe, par exemple un nombre entier de secondes s :

  String.format("%d:%02d:%02d", s / 3600, (s % 3600) / 60, (s % 60));

165voto

Gili Nachum Points 1178

J'utilise l'outil commun d'Apache DurationFormatUtils comme ça :

DurationFormatUtils.formatDuration(millis, "**H:mm:ss**", true);

93voto

Jon Skeet Points 692016

Si vous utilisez une version de Java antérieure à 8... vous pouvez utiliser Joda Time y PeriodFormatter . Si vous avez vraiment une durée (c'est-à-dire une quantité de temps écoulé, sans référence à un système de calendrier), vous devriez probablement utiliser la fonction Duration pour la plupart - vous pouvez alors appeler toPeriod (en précisant que PeriodType vous voulez refléter si 25 heures deviennent 1 jour et 1 heure ou non, etc) pour obtenir une Period que vous pouvez formater.

Si vous utilisez Java 8 ou une version ultérieure : Je suggère normalement d'utiliser java.time.Duration pour représenter la durée. Vous pouvez ensuite appeler getSeconds() ou autre pour obtenir un entier pour le formatage standard des chaînes de caractères, conformément à la réponse de Bobince, si nécessaire - bien que vous deviez faire attention à la situation où la durée est négative, car vous voulez probablement un simple signe négatif dans la chaîne de sortie. Donc quelque chose comme :

public static String formatDuration(Duration duration) {
    long seconds = duration.getSeconds();
    long absSeconds = Math.abs(seconds);
    String positive = String.format(
        "%d:%02d:%02d",
        absSeconds / 3600,
        (absSeconds % 3600) / 60,
        absSeconds % 60);
    return seconds < 0 ? "-" + positive : positive;
}

Le formatage de cette manière est raisonnablement simple, bien qu'ennuyeux à manier. Pour analyse syntaxique de cela devient une question plus difficile en général... Bien sûr, vous pouvez toujours utiliser Joda Time même avec Java 8 si vous le souhaitez.

52voto

Ole V.V. Points 24677

C'est plus facile depuis Java 9. A Duration n'est toujours pas formatable, mais des méthodes pour obtenir les heures, les minutes et les secondes ont été ajoutées, ce qui rend la tâche un peu plus simple :

    LocalDateTime start = LocalDateTime.of(2019, Month.JANUARY, 17, 15, 24, 12);
    LocalDateTime end = LocalDateTime.of(2019, Month.JANUARY, 18, 15, 43, 33);
    Duration diff = Duration.between(start, end);
    String hms = String.format("%d:%02d:%02d", 
                                diff.toHours(), 
                                diff.toMinutesPart(), 
                                diff.toSecondsPart());
    System.out.println(hms);

Le résultat de cet extrait est le suivant :

24:19:21

28voto

Mihai Vasilache Points 91
long duration = 4 * 60 * 60 * 1000;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault());
log.info("Duration: " + sdf.format(new Date(duration - TimeZone.getDefault().getRawOffset())));

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