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.
Réponses
Trop de publicités?J'utilise l'outil commun d'Apache DurationFormatUtils comme ça :
DurationFormatUtils.formatDuration(millis, "**H:mm:ss**", true);
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.
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
- Réponses précédentes
- Plus de réponses