Data Intervalo

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 ???

Desde já agradeço!!!

Bom dia.

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?

Creio eu, que um long possa resolver isso.

Edit: Isto aqui pode lhe ajudar :slight_smile:

Abraços.

nel é isso 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 ???

Obrigado

usando a API do joda Time é muito simples

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.

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=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.

Abraços!

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)

Amigos obrigado pela atenção!!!

Boa tarde.

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ê :slight_smile:

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?

Abraços.

  @Temporal(value =  TemporalType.TIMESTAMP)
  @Column(name = "tep_data_hora_inicio")
  private Date dataHoraInicio;
  @Temporal(value =  TemporalType.TIMESTAMP)
  @Column(name = "tep_data_hora_fim")
  private Date dataHoraFim;
  @Temporal(value = TemporalType.TIME)
  @Column(name = "tep_duracao_limite")
  private Date duracaoLimite;
  @Temporal(value = TemporalType.TIME)
  @Column(name = "tep_duracao_necessaria")
  private Date duracaoNecessaria;
  @Temporal(value = TemporalType.TIME)
  @Column(name = "tep_diferenca")

esta é minha entidade

esse é o banco

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

Obrigado nel

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…

Falows :wink:

Olá para terntar solucionar o caso!!

Como vc faria se precisasse exibir em relatorio com a media de horas necessaria para realizar uma determinada tarefa:

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

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

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

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

observem que nas 4 etapas o tempo real necessario foi de 28:00 entaum deveriamos alterar o tempo determinado de 25:00 para 28:00

com string eu poderia exibir em um relatorio com esse cálculo de MÉDIA de tempo real necessario para passar para o pessol alterar.

Obrigado!!!

o_O

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.

Obrigado

Boa tarde.

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));

int totalMinutes = (hours.getHours() * 60);
int diference = 0;
if(totalMinutes > minutes.getMinutes()) {
diference = totalMinutes - minutes.getMinutes();
} else {
diference = minutes.getMinutes() - totalMinutes;
}
System.out.println(hours.getHours() + “:” + diference);
//Resultado: 3:25[/code]

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 :slight_smile:

Abraços!

nel,
ainda naum tentei, mesmo assim só passei para agradecer.

Vou testar aki!!!

Muito Obrigado