Quero subtrair dois períodos de tempo, digamos 16:00:00 de 19:00:00. Existe alguma função java para isso? Os resultados podem ser em milissegundos, segundos ou minutos.
e do outro jeito? 16:00 - 19:00? Como posso calcular isso?
Alex Kapustian
Inverter as variáveis não vai adiantar muito. Neste exemplo, claro, você poderia invertê-las e pegar o valor absoluto ou algo assim. Mas o que acontece se você tiver meia-noite (00:00)?
rj2700 de
Que tal 23:15:00 - 01:15:00?
Oleksandr
e a diferença entre as 08:00:00 de hoje e as 10:00:00 de ontem ??????? Não acho que o que você sugeriu seja uma lógica quebrável.
Eu realmente gostei da sua resposta. Muito elegent! :)
Avinash
Portanto, isso se resume a duas importações e System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));registrar a duração. Eu não chamaria isso de uma solução agradável e limpa em Java8 se outras linguagens podem fazer isso com um código como print("Duration: " + str(time.time()-start))...
Luc
3
Limpeza @Luc não é o mesmo que brevidade. É muito mais claro exatamente o que está acontecendo na versão Java 8, e também é muito mais fácil de ajustar se, por exemplo, você deseja relatar a duração entre dois instantes em uma unidade diferente de milissegundos, ou como unidades múltiplas (por exemplo, em 1h 15m 3.022svez de 4503022 milliseconds) .
Também está disponível para Java SE 6 e 7 como porta traseira , bem como para Android .
Bryan
11
Como qualquer outro idioma; converta seus períodos de tempo para um carimbo de data / hora Unix (ou seja, segundos desde a época Unix) e então simplesmente subtraia. Em seguida, os segundos resultantes devem ser usados como um novo carimbo de data / hora Unix e lidos no formato que você quiser.
Ah, dê o devido crédito ao pôster acima (genesiss), o código está sempre à mão;) Porém, agora você também tem uma explicação :)
import java.util.Date;...Date d1 =newDate();......Date d2 =newDate();System.out.println(d2.getTime()-d1.getTime());//gives the time difference in milliseconds. System.out.println((d2.getTime()-d1.getTime())/1000);//gives the time difference in seconds.
e, para mostrar em um formato mais agradável, você pode usar:
Isso duplica outra resposta e não adiciona nenhum conteúdo novo. Por favor, não poste uma resposta a menos que você realmente tenha algo novo para contribuir.
DavidPostill
@DavidPostill, obrigado por sua atenção. Mas a solução que eu precisava de mim e não encontrei na postagem do GENESIS era a diferença de tempo entre a execução de duas linhas de código (como o ponto de partida e o ponto final do programa ou antes e depois de executar um método, não alguns tempos estáticos) . Achei que isso pode ajudar.
Alisa de
2
A maneira dolorosa é converter para milis e fazer a subtração e depois voltar para os segundos que você quiser. A melhor maneira é usar o JodaTime .
Nunca mencionei carimbos de data / hora unix. Também é um fato bem conhecido que a API Java Date and Time é uma droga para uso mais do que ocasional. JodaTime é muito melhor e provavelmente o caminho a percorrer até que o JSR 310 seja parte do Java. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser
@Manfred Moser: você deve ter ... Ambas as classes de tempo Java padrão e Joda fornecem um tempo em milis que começa no que é chamado de época do Unix . Nesse ponto, eles ficam muito próximos dos timestamps do Unix (um em milis, o outro em segundos). Em qualquer caso, o que o OP deseja pode ser feito trivialmente usando as classes Java padrão, pegando o número de milis desde a época do Unix e subtraindo-os.
SyntaxT3rr0r
1
Claro que pode ser feito de maneira trivial. E se você fizer muitos cálculos de data e hora em seu aplicativo, também pode criar trivialmente muitos bugs e reinventar sua própria pequena biblioteca implementando partes do JodaTime você mesmo novamente. Para um cálculo simples que pode ser bom, mas para uso frequente, vale a pena usar uma biblioteca decente. Estou apenas tentando apontar que a primeira solução simples pode não estar levando você no melhor caminho. O que há de errado nisso?
Manfred Moser
3
@Manfred Moser: Na verdade, a primeira solução simples é o caminho certo, considerando que o OP pediu a diferença entre dois períodos de tempo, não mudanças em um relógio atômico :)
Christian
Claro .. apenas para este exemplo e pergunta específica. Não para o quadro geral.
Além da abordagem mais comum com objetos Period e Duration, você pode ampliar seu conhecimento com outra maneira de lidar com o tempo em Java.
Bibliotecas Java 8 avançadas.
ChronoUnit para diferenças.
ChronoUnit é uma ótima maneira de determinar a distância entre dois valores temporais. Temporal inclui LocalDate , LocalTime e assim por diante.
LocalTime one =LocalTime.of(5,15);LocalTime two =LocalTime.of(6,30);LocalDate date =LocalDate.of(2019,1,29);System.out.println(ChronoUnit.HOURS.between(one, two));//1System.out.println(ChronoUnit.MINUTES.between(one, two));//75System.out.println(ChronoUnit.MINUTES.between(one, date));//DateTimeException
O primeiro exemplo mostra isso entre trunca em vez de rodadas.
O segundo mostra como é fácil contar unidades diferentes.
E o último exemplo nos lembra que não devemos bagunçar datas e horas em Java :)
Date start =newDate();//Waiting for 10 secondsThread.sleep(10000);Date end =newDate();long diff = end.getTime()- start.getTime();StringTimeTaken=String.format("[%s] hours : [%s] mins : [%s] secs",Long.toString(TimeUnit.MILLISECONDS.toHours(diff)),TimeUnit.MILLISECONDS.toMinutes(diff),TimeUnit.MILLISECONDS.toSeconds(diff));System.out.println(String.format("Time taken %s",TimeTaken));
Saída : Tempo gasto [0] horas: [0] minutos: [10] segundos
Embora este código possa responder à pergunta, fornecer contexto adicional sobre por que e / ou como este código responde à pergunta melhora seu valor a longo prazo.
Respostas:
A diferença está em milissegundos.
Eu modifiquei a postagem do sfaizs .
fonte
Java 8 tem uma solução mais limpa - Instantâneo e Duração
Exemplo:
fonte
System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));
registrar a duração. Eu não chamaria isso de uma solução agradável e limpa em Java8 se outras linguagens podem fazer isso com um código comoprint("Duration: " + str(time.time()-start))
...1h 15m 3.022s
vez de4503022 milliseconds
) .PARA obter diferenças de tempo bonitas, então
fonte
Java 8
fonte
Como qualquer outro idioma; converta seus períodos de tempo para um carimbo de data / hora Unix (ou seja, segundos desde a época Unix) e então simplesmente subtraia. Em seguida, os segundos resultantes devem ser usados como um novo carimbo de data / hora Unix e lidos no formato que você quiser.
Ah, dê o devido crédito ao pôster acima (genesiss), o código está sempre à mão;) Porém, agora você também tem uma explicação :)
fonte
e, para mostrar em um formato mais agradável, você pode usar:
fonte
A maneira dolorosa é converter para milis e fazer a subtração e depois voltar para os segundos que você quiser. A melhor maneira é usar o JodaTime .
fonte
lança exceção lida com exceções de análise
fonte
Além da abordagem mais comum com objetos Period e Duration, você pode ampliar seu conhecimento com outra maneira de lidar com o tempo em Java.
Bibliotecas Java 8 avançadas. ChronoUnit para diferenças.
ChronoUnit é uma ótima maneira de determinar a distância entre dois valores temporais. Temporal inclui LocalDate , LocalTime e assim por diante.
O primeiro exemplo mostra isso entre trunca em vez de rodadas.
O segundo mostra como é fácil contar unidades diferentes.
E o último exemplo nos lembra que não devemos bagunçar datas e horas em Java :)
fonte
Uma opção alternativa se o tempo for de dias diferentes, por exemplo: 22:00 e 01:55.
fonte
Agora, os minutos serão a duração correta entre dois tempos (em minutos).
fonte
}
fonte
Experimente isto:
fonte
fonte
Eu achei isso mais limpo.
fonte
fonte
class TimeCalculator {String updateTime;
fonte