Amigos,
Estou com a seguinte situacao: Tenho duas datas que compoem um intervalo 20/08/2010 08:00 a 21/08/2010 12:00 resumindo tenho um dia e quatro horas que corresponde a 28:00h.
Como seria o metodo que retornaria esse intervalo passando as duas datas e como eu uso postgre sql o que eu salvaria no banco, o valor Long ou Hora em si ???
Você tem algum código para apresentar que esteja gerando o erro?
Pois se não tiver, está pedindo que alguém implemente isto para você, correto?
A API Joda Time trabalha com manipulação de datas, creio que ela será muito útil á você.
Sobre o banco de dados, vai guardar somente o intervalo em horas mesmo?
tenho processos que inicializam e finalizam, preciso simplesmente saber quantas horas foram necessarias e naum preciso de data só horas. se eu salvar um long no banco ele naum considerara que foi uma data em si ???
Date inicio = new Date();
//faz alguma coisa
Date fim = new Date();
Hours tempo = Hours.hoursBetween(new DateTime(inicio), new DateTime(fim));
tempo.getHours(); //Retorna um int contendo as horas de diferença entre o inicio e o fim.
[quote=o_0]felagund e nel brigadao,
Mas se ao inves do int de retorno eu precisasse mostrar em hh:mm a diferença, qual classe ou metodo do Joda Time[/quote]
Bom, em Joda Time, sinceramente não sei.
Mas pode simplesmente executar uma lógica em cima deste valor retornado e depois formatar o resultado em uma String.
Um exemplo, uma hora é o equivalente a sessenta minutos, perfeito?
Então, se o resultado for 60, seria:
System.out.println("Total de horas: " + horas);
Supondo que horas seja uma variavél do tipo String contendo o resultado desejado, neste caso, a variavél horas teria o conteúdo “01:00”.
Podes até criar um método que a partir de um int retorna uma String formatada com as horas.
Amigos, obrigado pelas sugestões, porém ainda não consegui resolver esta stuação que serei mais explicito:
tenho uma tela que tenho que informa a a data inicial e final de uma determindada etapa. Antes eu sei que cada etapa exige um tempo determindado, tambem preciso armazenar duas informações, o tempo que de fato foi necessario para ser realizar a etapa e a soma do tempo necessario - o tempo determinado.
bem modelo
ETAPA A : inicio 20/08/2010 10:00 e fim 21/08/2010 - 14:00
TEMPO DETERMINDADO : 25:00h
TEMPO REAL NECESSARIO : 28:00h
DIFERENÇA : 03:00h
estes valores eu preciso que sejam tbm armazenados em um banco de dados postgre.
Alem da codificação, precisaria saber que tiver de dados eu trabalharia no java (Date, Time, Long) e sucessivamente que tipo de dados no banco eu criaria minha tabela (Date, Time, Interval)
Por acaso, aplicou alguma das sugestões citadas acima?
Você fez o download do Joda Time e utilizou a API como o colega Felagund demonstrou?
Bom, se fez tudo isso e não está obtendo sucesso, poste o código que desenvolveu em relação a esta necessidade e o resultado que está sendo apresentado, seja uma exceção ou um resultado errôneo mesmo, ou seja, espera-se que o resultado seja 3 e retornou 4, por exemplo.
Como eu disse, poste o código ok?
Pois estou começando a achar que você quer que alguém desenvolva isto para você
Sobre o tipo de dado no Postgre, creio que podes trabalhar inclusive com String (VARCHAR), tendo em vista que irá persistir um horário formatado, perfeito?
tep_tgi_operacao numeric(5) NOT NULL,
tep_data_hora_inicio timestamp without time zone,
tep_data_hora_fim timestamp without time zone,
tep_duracao_limite numeric(5),
tep_duracao_necessaria numeric(5),
tep_diferenca numeric(5),
observe q aki estao numeric, pois antes eu estava querendo so a hora no formato numerico, porem senti a necessidade de mostar forma de hora mesmo 01:00
e esse é um teste com a dica que vc me mandou
public static void main(String [] args){
Date d1=new Date(60*60*1000*24);
Date d2=new Date(60*60*1000*76);
System.out.println(d1.toString() + " " + d2.toString());
Hours t=Hours.hoursBetween(new DateTime(d1), new DateTime(d2));
System.out.print(t.getHours());
}
a questao é se eu vou salvar um numero long que correponde ha horas ou minutos entaum meus atributos serao do tipo Long, mas se eu ja posso salvar horas e minutos no java meus atributos seriam do tipo Date, Time para montar os get e set.
quando a erro não ha nenhum é mais questao de diminui gambs, deixar o codigo mais objetivo ta
eh realmente necessario guardar os valores de calculo ?? vais gerar consultas em cima deles ??? Pois voce poderia armazenar soh a Data e toda vez, ao apresentar, calcular os valores exibidos…
Caso precise guardar os valores, simplesmente guarde como String… o fato de precisar de hh:mm pode ser resolvido no calculo, o valor pode ser String…
vi que voce quer guardar um hitorico do ocorrido pra poder ter tomada de decisoes…
Bom… ainda acho que voce deve guardar as Datas/Horas nos 2 campos principais e guarde o calculo como uma String formatada nos demais campos… POderias fazer o calculo em tempo de execucao e nao guardar esses valores, so que numa consulta muito grande, eh melhor trazer de um BD o valor ja formatado, tiras o Processamento da consulta, porem teu BD fica maior… voce deve tomar essa decisao com base no seu negocio…
Agora, realmente seu problema maior esta no calculo do valor de diferenca…
Pergunta: o tempo determinado eh defnido por quem ???
Esse tempo é pre-defindo em tabela parametrizada:
tab_etapa
ETAPA A DURARA : 4 DIAS = 96:00
ETAPA B DURARA : 5 DIAS = 120:00
ETAPA B DURARA : SO 03:00
quando eu seleciono a etapa eu ja pego a duracao e replico tab_etapa_operacao ai quando eu digo as datas (inicio/fim) que inicalmente sao null e eu posso mudar posteriormente.
Fiz as pressas e a principio resolve o seu problema.
Provavelmente a logica precisa ser melhorada, mas como extrair as horas e os minutos do intervalo você já sabe e é bem simples.
Neste caso, os minutos são totais, ou seja, se foram 3 horas o resultado será o seu equivalente, sendo assim, 180 minutos. Neste caso, é só aplicar uma pequena lógica.
Como eu disse, fiz as pressas, então, podes melhorar isto.
[code]
//Exemplo, com hora “quebrada”
Date atualDate = new SimpleDateFormat(“yyyy/MM/dd HH:mm”).parse(“2010/08/26 18:00”);
Date oldDate = new SimpleDateFormat(“yyyy/MM/dd HH:mm”).parse(“2010/08/26 14:35”);
Hours hours = Hours.hoursBetween(new DateTime(oldDate), new DateTime(atualDate));
Minutes minutes = Minutes.minutesBetween(new DateTime(oldDate), new DateTime(atualDate));
Edit: pensamento rápido que me passou, creio que o total de minutos (horas * 60) será inferior ao resultado da classe minutes, pois ela retorna o total de minutos para um determinado intervalo. O total de minutos é o resultado do total de horas * 60 e o calculo efetuado pela classe minutes é total de horas * 60 + “alguma coisa”, pois podem haver horas quebradas. Exemplo: 1:35. Como eu disse, pensamento rápido, confirme isso e ai poderás retirar este if