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
E seu eu colocar o esforço assim 0.45?
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
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.
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.
Entendi. Cara, muito obrigado pela ajuda.