Estou confuso. Depois de tropeçar nessa discussão, tentei descobrir como formatar um cronômetro de contagem regressiva que tivesse o formato hh:mm:ss
.
Aqui está a minha tentativa -
//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)));
Então, quando tento um valor como 3600000ms
, recebo 01:59:00
, o que está errado, pois deveria estar 01:00:00
. Obviamente, há algo errado com minha lógica, mas, no momento, não consigo ver o que é!
Alguém pode ajudar?
Editar -
Corrigido. Aqui está a maneira correta de formatar milissegundos para hh:mm:ss
formatar:
//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))));
O problema era esse TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
. Deveria ter sido isso TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
.
java
time-format
countdowntimer
senhor
fonte
fonte
00:59:59
, deveria ser01:00:00
.Respostas:
Você estava realmente perto:
Você estava convertendo horas em milissegundos usando minutos vez de horas .
BTW, eu gosto do seu uso da
TimeUnit
API :)Aqui está um código de teste:
Resultado:
Percebi que meu código acima pode ser bastante simplificado usando uma divisão de módulo em vez de subtração:
Ainda está usando a
TimeUnit
API para todos os valores mágicos e fornece exatamente a mesma saída.fonte
.replaceAll("^00:", "")
ou.replaceAll("^00:(00:)?", "")
remova minutos e horas, se ambos forem zero."15:00"
e,"10:00:23"
respectivamente; somente zeros à esquerda são removidos devido à ancoragem da correspondência no início da entrada^
.O método genérico para isso é bastante simples:
fonte
String.format("%
02d:%02d:%02d", h,m,s)
?Se você estiver usando o apache commons:
fonte
DurationFormatUtils.formatDurationHMS(timeInMS);
Eu usei isso:
Veja a descrição da classe Formatter .
Veja o exemplo executável usando a entrada de 2400 ms.
fonte
String.format()
é fuso horário dependente . A resposta correta ideal, no entanto, deve ser independente do fuso horário .String.format()
é o fuso horário dependente . A resposta correta ideal, no entanto, deve ser independente do fuso horário .Veja o exemplo executável usando entrada de 1200 ms.
fonte
fonte
Resultados do teste para as 4 implementações
Tendo que fazer muita formatação para obter grandes dados, precisava do melhor desempenho, então aqui estão os resultados (surpreendentes):
para (int i = 0; i <1000000; i ++) {FUNCTION_CALL}
Durações:
formatTimeUnit: 2216 milis
fonte
StringBuilder
e cometeu o erro de usar "0" + número de "ruínas" dele. O GC da @VM JVM é extremamente bom em alocar e coletar muitos objetos de vida curta, não se preocupe. Eu fui comString.format
nenhuma lógica de zero-zero para lidar.isso funcionou para mim, com kotlin
fonte
Seguindo a resposta de Bohemian, não precisamos usar o TimeUnit para encontrar um valor conhecido. Um código muito mais ideal seria
Espero que ajude
fonte
millisLeft%1000/10
para obter o formato #hour:minutes:seconds:milliseconds
millisLeft%1000
fonte
Java 9
Isso imprime:
Você está fazendo certo ao permitir que os métodos da biblioteca façam as conversões envolvidas para você.
java.time
, a moderna API de data e hora do Java, ou mais precisamente, suaDuration
classe o faz de maneira mais elegante e menos propensa a erros do queTimeUnit
.Os métodos
toMinutesPart
etoSecondsPart
que eu usei foram introduzidos no Java 9.Java 6, 7 e 8
A saída é a mesma que acima.
Pergunta: Como isso pode funcionar no Java 6 e 7?
java.time
vem embutido.org.threeten.bp
com subpacotes.Ligações
java.time
.java.time
foi descrito pela primeira vez.java.time
para Java 6 e 7 (ThreeTen para JSR-310).fonte
O código abaixo faz a conversão nos dois sentidos
23: 59: 58: 999 a 86398999
e então
86398999 a 23: 59: 58: 999
fonte
Formato: 00: 00: 00.000
Exemplo: 615605 Milissegundo
00: 10: 15.605
fonte
A resposta marcada como correta tem um pequeno erro,
por exemplo, este é um exemplo do valor que recebo:
Esta é a solução para obter o formato correto é:
obtendo como resultado um formato correto:
outra opção para obter o formato
hh:mm:ss
é apenas:fonte
Eu tentei como mostrado na primeira resposta. Funciona, mas menos me trouxe confusão. Minha resposta por Groovy:
fonte
Para Kotlin
onde,
milSecs
é milissegundosfonte
Bem, você pode tentar algo como isto:
converter milissegundos em um valor de tempo
fonte