GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Calcular periodo e horas entre datas

java
Tags: #<Tag:0x00007f9d25724b50>

#22

Vamos supor um esforço de 187 horas (escolhi aleatoriamente), começando em 10/04/2017, com atividade entre 07:30 e 12:00 e 13:00 e 17:30 horas.
Temos:

        //9 horas por dia
        int horasDia = 9;
        //Data inicial
        String dataIni = "10/04/2017";
        //Esforço total
        int totalEsforco = 187;

        int diasInteiros = totalEsforco/horasDia;
        int parte = totalEsforco%horasDia;
        
        System.out.println("Serão " + diasInteiros + " dias e " + parte + " horas");
        
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(dataIni));
        cal.add(Calendar.DAY_OF_MONTH, diasInteiros + (parte != 0 ? 1 : 0));
        System.out.println("Data final: " + sdf.format(cal.getTime()));

E a saída

Serão 20 dias e 7 horas
Data final: 01/05/2017

Mudando para 72 horas de esforço:

Serão 8 dias e 0 horas
Data final: 18/04/2017

E mudando para 235 horas

Serão 26 dias e 1 horas
Data final: 07/05/2017

#23

E seu eu colocar o esforço assim 0.45?


#24

0.45 precisa ser convertido em horas. Para isso, você precisa utilizar regra de três e calcular quanto de uma hora é 0.45.
Mesmo assim, você já tem o total de esforço, não precisa calcular novamente.

Edit:

Usando a mesma estrutura anterior, apenas adequando para a tua questão:

        //9 horas por dia
        int horasDia = 9;
        //Data inicial
        String dataIni = "10/04/2017";
        //Esforço total
        float totalEsforco = 235.45f;
        
        int diasInteiros = (int) totalEsforco/horasDia;
        float parte = totalEsforco%horasDia;
        
        int parteInteira = (int) parte;
        float minutes = (parte - parteInteira) * 60;
        
        System.out.println("Serão " + diasInteiros + " dias e " + parteInteira + " horas e " + minutes + " minutos");
        
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(dataIni));
        cal.add(Calendar.DAY_OF_MONTH, diasInteiros + (parte != 0 ? 1 : 0));
        System.out.println("Data final: " + sdf.format(cal.getTime()));

E a saída é algo assim

Serão 26 dias e 1 horas e 26.999817 minutos
Data final: 07/05/2017

#25

O que eu notei Luiz, é que está ignorando o dia e começando no dia 11/04/2017. Coloca 27h de esforço deveria acabar dia 12/04/2017, incluindo o dia 10/04.


#26

Com certeza!
Quando você invoca o método set de um objeto da classe Calendar, ele vai pegar o valor da data que aquele objeto representa e adicionar ao campo especificado (Calendar.DAY_OF_MONTH, no caso) o valor informado.
Cabe a você controlar isso.
Das duas uma: ou você coloca a data com um dia antes (cal.set(Calendar.DAY_OF_MONTH, (-1));) ou você remove um dia do total de dias calculado a partir da divisão de esforço por horas por dia.


#27

Entendi. Cara, muito obrigado pela ajuda.