Preciso fazer a subtração de 2 horas (entrada e saída). Exemplo: E - 09:00hs // S - 18:00hs = 09:00hs
Pesquisei uma maneira de fazer isso achei as classes Date e DateFormat, porém não achei eficiente.
Tive a idéia de validar as 2 horas (tipo String), depois percorrer cada uma através do charAt(), pegar os dois primeiros caracteres e transformar em tipo int.
Somente após isso fazer a subtração das datas e ao final concatenar, além de transformar novamente p/ String.
É trabalhoso mas acho que funciona.
Vocês acham que vale a pena o trabalho ou existe uma maneira mais simples e eficiente?
Coincidência, nesse exato momento estou com esse código aberto aqui e tentando entender.
Vamos ver se serve para o que preciso.
Se mais alguém opinar, fico agradecido.
P
pablodiego
Boa noite.
Utiliza a classe Calendar que vc pode adicionar ou subtrair dias, horas, minutos, segundos, anos, enfim…vc pode manipular as horas ou data com muita facilidade e eficiência.
Por exemplo para subtrair 2 horas:
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, -2);
System.out.println(calendar.getTime());
vlw abraços
Banzai10
Só para complementar a resposta,
Date está deprecated, o novo objeto que veio para tomar as funcionalidades de data é a Calendar,
que por sua vez é uma classe abstrata, a implementação dela que corresponde ao tipo de data que utilizamos
no nosso dia a dia, é a GregorianCalendar.
ViniGodoy
A API pura do Java é uma completa droga para manipular datas.
Não é eficiente, não é produtivo e, no final das contas, também não é multi-plataforma.
Entretanto, alguns programadores criaram outra API, chamada JODA-Time, que não só resolveu todos os problemas de maneira simples, como também já está sendo cotada para entrar nas próximas versões do Java.
Claro que cada caso é um caso, somente vendo par eu pode opinar melhor, mas de príncipio concordo com nosso amigo Pablo Diego, simples e objetivo.
[]´s
Boa noite.
Utiliza a classe Calendar que vc pode adicionar ou subtrair dias, horas, minutos, segundos, anos, enfim…vc pode manipular as horas ou data com muita facilidade e eficiência.
Por exemplo para subtrair 2 horas:
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, -2);
System.out.println(calendar.getTime());
vlw abraços
ViniGodoy
Vai por mim… usar o Calendar é um caminho rápido e certo para o arrependimento.
Certas operações com datas ficam muito complexas com ele.
Use o JODA-Time, senão depois vc terá que sair mudando o programa inteiro.
ViniGodoy
Só a título de exemplo. Como vocês fariam esses dois métodos, aqui escritos com JODA-Time, usando Calendar?
O primeiro testa quantos dias existe entre hoje e 1 de janeiro do próximo ano.
O segundo testa se um aluguel está dentro do período de aluguel, que é de 2 dias e 12 horas.
Notem a sintaxe extremamente compacta e elegante.
R
rafaeU
Resumindo…
Melhor eu esquecer a idéia de criar uma classe para subtrair horas?
lgmhorus
Normalmente é melhor usar algo que já existe do que reiventar a roda
R
rafaeU
ViniGodoy:
Vai por mim… usar o Calendar é um caminho rápido e certo para o arrependimento.
Certas operações com datas ficam muito complexas com ele.
Use o JODA-Time, senão depois vc terá que sair mudando o programa inteiro.
ViniGodoy, estou olhando o JODA-Time, porém não estou achando os métodos para fazer o procedimento que preciso.
Pode dar uma força?
E também, onde (pasta) devo descompactar o pacote do JODA?
Uso o JCreator.
lgmhorus
Bem, eu nunca usei o JodaTime, então não posso dizer muito, mas com Calendar, vc pode converter para milisegundos, fazer a operação, e converter para horas. Se for apenas horas redondas, pode fazer algo do tipo:
long dif = cal.getTimeInMillis() - cal2.getTimeInMillis();
dif = dif/3600000L;
System.out.println(Math.abs(Math.round(dif)));
Bem, eu nunca usei o JodaTime, então não posso dizer muito, mas com Calendar, vc pode converter para milisegundos, fazer a operação, e converter para horas.
Pesquisei sobre o Calendar, encontrei diversos comentários falando sobre sua ineficiência. Isso me deixou com um pé atrás.
Desa forma gostaria de utilizar o JODA Time.
Nesse momento estou lendo a doc, mas devido a minha falta de experiência está complicado.
Não sei nem onde descompatar o pacote do JODA.
R
rafaeU
Creio que com isso eu consigo fazer o que preciso (documentação JODA)...
Porém não consigo aplicar na prática.
Primeiro pela dificuldade de trabalhar com pacotes. Segundo por desconhecer alguns parâmetros.
Alguém por aí já trabalhou com o JODA?
ViniGodoy
O que você quer fazer, exatamente?
R
rafaeU
ViniGodoy:
O que você quer fazer, exatamente?
Receber…(ex.)
Data de entrada: 08:00
Data de Saída: 17:00
Resposta: 09:00
E preciso também, agora, saber onde descompactar o pacote do JODA e como importar isso p/ minha classe.
Obrigado!
ViniGodoy
Aqui vai um exemplo que funciona:
importjava.util.Scanner;importorg.joda.time.DateTime;importorg.joda.time.Period;importorg.joda.time.format.DateTimeFormat;importorg.joda.time.format.DateTimeFormatter;importorg.joda.time.format.PeriodFormatter;importorg.joda.time.format.PeriodFormatterBuilder;publicclassMain{privatestaticfinalDateTimeFormatterDATE_FORMAT=DateTimeFormat.forPattern("H:mm");privatestaticfinalPeriodFormatterPERIOD_FORMAT=newPeriodFormatterBuilder().printZeroAlways().minimumPrintedDigits(2).appendHours().appendLiteral(":").appendMinutes().toFormatter();privatestaticDateTimeleHora(Stringtexto){while(true){Scannerin=newScanner(System.in);System.out.println(texto);Stringhora=in.nextLine();try{DateTimedt=DATE_FORMAT.parseDateTime(hora);returndt;}catch(Exceptione){System.out.println("Hora inválida!");}}}publicstaticvoidmain(String[]args){DateTimeentrada=leHora("Hora de entrada: ");DateTimesaida=leHora("Hora de saída: ");Periodperiod=newPeriod(entrada,saida);System.out.println("Periodo: "+PERIOD_FORMAT.print(period));}}
R
rafaeU
Vou dar uma olhada com calma.
Valeu Vini!
ViniGodoy
Atualizei o exemplo ali em cima para trabalhar com um formatter de período.
É uma boa política definir os formatos que sua aplicação vai usar em constantes.
No JODA, os formatos são responsáveis tanto por imprimir uma data ou período em texto, quanto transformar um texto numa data ou período. Eles lançam uma exceção caso o texto informado for inválido.
Note que o exemplo ali em cima não tem nenhuma calculeira proposta pelos colegas, que você fatidicamente teria que fazer caso você tivesse que trabalhar com Calendar.
R
rafaeU
Tentei compilar o código e apresentou erro no import dos pacotes.
ViniGodoy
Hein? Você inclui o .jar do JODA no seu projeto?
R
rafaeU
É exatamente isso que tenho dúvida de come fazer.
Vale lembrar que ainda em fase de testes e estudos, estou somente criando classes isoladas no JCreator.
Não tenho um projeto.
ViniGodoy
Eu não conheço o JCreator. Mas provavelmente você terá que criar o projeto e adicionar a lib do joda-time lá.
R
rafaeU
Vou testar.
Valeu Vini.
M
malsan
Será que os fabricantes de software pensam assim?!
lgmhorus
Será que os fabricantes de software pensam assim?!
Sim, se eles conseguirem chamar a roda de outra coisa e cobrar mais por isso
M
malsan
Será que os fabricantes de software pensam assim?!
Sim, se eles conseguirem chamar a roda de outra coisa e cobrar mais por isso ;)
Boa! Na verdade eles lançam a roda em novas cores!!! XD
Aquele abraço!!!
Andre_Brito
Será que os fabricantes de software pensam assim?!
Sim, se eles conseguirem chamar a roda de outra coisa e cobrar mais por isso ;)
Boa! Na verdade eles lançam a roda em novas cores!!! XD
Aquele abraço!!!