Je voudrais 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.
Je voudrais 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.
Si vous utilisez une version de Java antérieure à 8 ... vous pouvez utiliser Joda Time et PeriodFormatter
. Si vous avez vraiment une durée (c'est-à-dire une durée écoulée, sans référence à un système de calendrier), vous devriez probablement l'utiliser Duration
pour la plupart - vous pouvez alors appeler toPeriod
(en spécifiant ce que PeriodType
vous voulez pour indiquer si 25 heures deviennent 1 jour et 1 heure ou pas, etc.) pour obtenir un Period
format que vous pouvez formater.
Si vous utilisez Java 8 ou version ultérieure: je suggère normalement d'utiliser java.time.Duration
pour représenter la durée. Vous pouvez ensuite appeler getSeconds()
ou similaire pour obtenir un entier pour le formatage de chaîne standard selon la réponse de bobince si vous en avez besoin - bien que vous devriez faire attention à la situation où la durée est négative, car vous voulez probablement un seul 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 que manuel ennuyeux. Pour l' analyse cela devient une question plus difficile en général ... Vous pouvez toujours utiliser Joda Time même avec Java 8 si vous le souhaitez, bien sûr.
Duration
méthodes de s:duration.toHours()
,duration.toMinutesPart()
etduration.toSecondsPart()
qui sont disponibles depuis Java 9. Et pour obtenir la valeur absolue peut utiliserduration.abs()
.Si vous ne voulez pas faire glisser dans les bibliothèques, c'est assez simple de le faire vous-même en utilisant un formateur ou un raccourci associé, par exemple. donné nombre entier de secondes s:
la source
s/86400, (s%86400)/3600...
jours si nécessaire ...s > 8640
0 (un jour):"\u221E"
- infiniJ'utilise DurationFormatUtils d' Apache commun comme ceci:
la source
C'est plus facile depuis Java 9. A
Duration
n'est toujours pas formatable, mais des méthodes pour obtenir les heures, minutes et secondes sont ajoutées, ce qui rend la tâche un peu plus simple:Le résultat de cet extrait de code est:
la source
la source
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
avant d'utiliser laformat
fonction.DateFormat.getDateInstance()
au lieu de classes concrètes.Cela peut être un peu piraté, mais c'est une bonne solution si l'on veut accomplir cela en utilisant Java 8
java.time
:la source
Duration.ofSeconds(20)
), alors j'obtiendrais unUnsupportedTemporalTypeException
). J'ai simplement supprimé le code vérifiant si la différence est== 01
. J'ai pensé qu'il y01
avait une sorte de valeur de masquage que je ne comprends pas complètement, pouvez-vous l'expliquer?isSupported
méthode, il renvoie les informations s'il existe un champ valide à afficher sur la chaîne lisible par l'homme. Quoi qu'il en soit, le "masquage" n'est en fait pas un masque. Le codereturn value!=0l
ne montre pasreturn value!=01
. Veuillez utiliser le copier-coller la prochaine fois.TemporalAccessor
n'est pas censée être mal utilisée pendant des durées. JSR-310 a conçu l'interfaceTemporalAmount
à cet effet.L
pour signifier unelong
valeur. Il est si facile de mal interpréter les minusculesl
pour le chiffre 1, comme je viens de le démontrer.Voici un autre exemple de formatage de la durée. Notez que cet échantillon montre à la fois la durée positive et la durée négative comme une durée positive.
la source
Cette réponse utilise uniquement des
Duration
méthodes et fonctionne avec Java 8:la source
Ceci est une option de travail.
Appelez la méthode avec
Produit quelque chose comme:
la source
Que diriez-vous de la fonction suivante, qui renvoie soit + H: MM: SS ou + H: MM: SS.sss
la source
Il existe une approche assez simple et élégante (IMO), au moins pour des durées inférieures à 24 heures:
DateTimeFormatter.ISO_LOCAL_TIME.format(value.addTo(LocalTime.of(0, 0)))
Les formateurs ont besoin d'un objet temporel pour formater, vous pouvez donc en créer un en ajoutant la durée à un LocalTime de 00:00 (c'est-à-dire minuit). Cela vous donnera un LocalTime représentant la durée de minuit à cette heure, qui est alors facile à formater en notation standard HH: mm: ss. Cela a l'avantage de ne pas avoir besoin d'une bibliothèque externe et utilise la bibliothèque java.time pour faire le calcul, plutôt que de calculer manuellement les heures, les minutes et les secondes.
la source
la source
en utilisant cette fonction
la source
Ma bibliothèque Time4J propose une solution basée sur des modèles (similaire
Apache DurationFormatUtils
, mais plus flexible):Ce code montre les capacités de gérer le dépassement d'heures et la gestion des signes, voir aussi l'API de duration-formatter basé sur un modèle .
la source
Dans scala (j'ai vu d'autres tentatives et je n'ai pas été impressionné):
Ça a l'air horrible, oui? Eh bien, c'est pourquoi nous utilisons des IDE pour écrire ce truc de sorte que les appels de méthode (
$toHoursPart
etc.) soient d'une couleur différente.L' interpolateur de chaîne
f"..."
est unprintf
/String.format
style (ce qui permet à l'$
injection de code de fonctionner) Étant donné une sortie de1 14:06:32.583
, laf
chaîne interpolée serait équivalente àString.format("1 %02d:%02d:%02d.%03d", 14, 6, 32, 583)
la source
Dans Scala, s'appuyer sur la solution de YourBestBet mais simplifié:
la source
dans scala, aucune bibliothèque nécessaire:
la source
Je n'ai pas vu celui-ci alors j'ai pensé l'ajouter:
Cela ne fonctionne que pendant 24 heures, mais c'est ce que je veux généralement pour la durée.
la source