Eu gostaria de formatar uma duração em segundos usando um padrão como H: MM: SS. Os utilitários atuais em java foram projetados para formatar um horário, mas não uma duração.
fonte
Eu gostaria de formatar uma duração em segundos usando um padrão como H: MM: SS. Os utilitários atuais em java foram projetados para formatar um horário, mas não uma duração.
Se você estiver usando uma versão do Java anterior a 8 ... poderá usar o Joda Time e PeriodFormatter
. Se você realmente tem uma duração (isto é, uma quantidade de tempo decorrido, sem referência a um sistema de calendário), provavelmente deve estar usando Duration
a maior parte do tempo - pode ligar toPeriod
(especificando o PeriodType
que deseja refletir se 25 horas se tornar 1 dia e 1 hora ou não, etc) para obter um Period
formato que você possa formatar.
Se você estiver usando o Java 8 ou posterior: normalmente sugiro usar java.time.Duration
para representar a duração. Em seguida, você pode ligar getSeconds()
ou algo semelhante para obter um número inteiro para a formatação de sequência padrão, conforme a resposta de bobince, se necessário - embora você deva ter cuidado com a situação em que a duração é negativa, pois provavelmente deseja um único sinal negativo na sequência de saída . Então, algo como:
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;
}
Formatar dessa maneira é razoavelmente simples, embora irritantemente manual. Para analisar , torna-se um assunto mais difícil em geral ... Você ainda pode usar o Joda Time, mesmo com o Java 8, se quiser, é claro.
Duration
métodos s:duration.toHours()
,duration.toMinutesPart()
eduration.toSecondsPart()
que estão disponíveis desde Java 9. E para obter o valor de um absoluto pode usarduration.abs()
.Se você não deseja arrastar as bibliotecas, é simples o suficiente para fazer você mesmo usando um Formatador ou um atalho relacionado, por exemplo. dado número inteiro de segundos s:
fonte
s/86400, (s%86400)/3600...
por dias, se necessário ...s > 8640
0 (um dia):"\u221E"
- infinitoEu uso o DurationFormatUtils do Apache common assim:
fonte
Isso é mais fácil desde o Java 9. A
Duration
ainda não é formalizável, mas são adicionados métodos para obter horas, minutos e segundos, o que torna a tarefa um pouco mais direta:A saída desse snippet é:
fonte
fonte
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
antes de usar aformat
função.Isso pode ser meio hacky, mas é uma boa solução se alguém se empenhar em fazer isso usando o Java 8
java.time
:fonte
Duration.ofSeconds(20)
), obteria umUnsupportedTemporalTypeException
). Eu simplesmente removi o código, verificando se a diferença é== 01
. Achei que01
era algum tipo de valor mascarado que ainda não entendi, você pode explicar?isSupported
método está retornando as informações se houver um campo válido para mostrar na sequência legível por humanos. De qualquer forma, o "mascaramento" não é realmente uma máscara. O códigoreturn value!=0l
não mostrareturn value!=01
. Por favor, use copiar e colar da próxima vez.TemporalAccessor
não deve ser mal utilizada por durações. O JSR-310 projetou a interfaceTemporalAmount
para esse fim.L
para significar umlong
valor. É tão fácil interpretar em minúsculas ol
dígito 1, como demonstrado.Aqui está mais um exemplo de como formatar a duração. Observe que esta amostra mostra duração positiva e negativa como duração positiva.
fonte
Esta resposta usa apenas
Duration
métodos e funciona com Java 8:fonte
Que tal a seguinte função, que retorna + H: MM: SS ou + H: MM: SS.sss
fonte
Há uma abordagem bastante simples e elegante (IMO), pelo menos por períodos inferiores a 24 horas:
DateTimeFormatter.ISO_LOCAL_TIME.format(value.addTo(LocalTime.of(0, 0)))
Os formatadores precisam de um objeto temporal para formatar, para que você possa criar um adicionando a duração a um LocalTime de 00:00 (ou seja, meia-noite). Isso fornecerá um LocalTime representando a duração da meia-noite até a hora, que é fácil de formatar na notação HH: mm: ss padrão. Isso tem a vantagem de não precisar de uma biblioteca externa e usa a biblioteca java.time para fazer o cálculo, em vez de calcular manualmente as horas, minutos e segundos.
fonte
Esta é uma opção de trabalho.
Chame o método com
Produz algo como:
fonte
fonte
Minha biblioteca Time4J oferece uma solução baseada em padrões (semelhante a
Apache DurationFormatUtils
, mas mais flexível):Esse código demonstra os recursos para lidar com excesso de horas e manipulação de sinais; consulte também a API do formatador de duração com base no padrão .
fonte
Em scala (vi outras tentativas e não fiquei impressionado):
Parece horrível, sim? Bem, é por isso que usamos IDEs para escrever essas coisas, para que as chamadas de método (
$toHoursPart
etc) sejam de cores diferentes.O
f"..."
é umprintf
/String.format
interpolador de cadeia de caracteres style (que é o que permite que a$
injeção de código funcione) Dada uma saída de1 14:06:32.583
, af
cadeia de caracteres interpolada seria equivalente aString.format("1 %02d:%02d:%02d.%03d", 14, 6, 32, 583)
fonte
usando esta função
fonte
Na Scala, desenvolvendo a solução da YourBestBet, mas simplificado:
fonte
no scala, nenhuma biblioteca é necessária:
fonte
Não vi este, então pensei em adicioná-lo:
Só funciona por 24 horas, mas é o que eu normalmente quero por duração.
fonte