[Resolvido] Obter datas entre duas datas

Bom dia, pessoal.
Estou com um problema a qual não consigo a solução, estou fazendo um relatório com java e apache poi,
um deses relatório tenho que passar um intervalo entre datas para gerar o relatório, na verdade o que me interessa é somente o mês e o ano, pois quando monto a query sempre monto a data recuperada entre o dia 01 e 31.

tenho esse código que faço usando millesegundos, mas ele não é eficiente pois passo 30 dias e nem sempre o mês tem 30 dias.

private List<Date> getRageDate(String dataInicial, String dataFinal){
		
		List<Date> dates = new ArrayList<Date>();	

		DateFormat formatter ; 
		
		try {

		formatter = new SimpleDateFormat("dd/MM/yyyy");
		SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd");
		Date startDate;		
		startDate = (Date)formatter.parse(dataInicial);		
		Date  endDate = (Date)formatter.parse(dataFinal);
		long interval = 2629800000L; // 1 month in millis
		long endTime =endDate.getTime() ; 
		long curTime = startDate.getTime();
		while (curTime <= endTime) {
		    dates.add(new Date(curTime));
		    curTime += interval;
		}
		
		for(int i=0;i<dates.size();i++){
		    Date lDate =(Date)dates.get(i);
		    String ds = formatter2.format(lDate);    
		    System.out.println(" Date is ..." + ds);
                    dates.add(ds); 
		}
		
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
		return null;
		
	}

preciso de algo que retorne os meses entre duas datas tipo:
dataInicial = “01-01-208” e dataFInal = “27-04-2018”;

teria que retornar
01-01-208
01-02-2018
01-03-208
01-04-208

os dias não importa, eu poderia até substituir o dia que pego do front end sempre para 01 que não teria problema.

Agradeço desde já.

Boa tarde amigo.

Não sei se é necessário usar Date então coloquei duas formas aqui:

public class DateUtil {

    /**
     * dataInicial = “01/01/2018” e dataFInal = “27/04/2018”;
     *
     * saída [2018-01-01, 2018-02-01, 2018-03-01, 2018-04-01]
     *
     * @param dataInicial
     * @param dataFinal
     * @return
     */
    public List<Date> getRangeDate(String dataInicial, String dataFinal) {

        try {
            //cria lista
            List<Date> dates = new ArrayList();
            //cria formatador de datas
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            //adiciona a primeira data
            dates.add(sdf.parse(dataInicial));
            //cria objetos calendars
            Calendar initialDate = Calendar.getInstance();
            Calendar finalDate = Calendar.getInstance();
            //seta data inicial e final nos calendars setando o dia para 1
            initialDate.setTime(dates.get(0));
            initialDate.set(Calendar.DAY_OF_MONTH, 1);
            finalDate.setTime(sdf.parse(dataFinal));
            finalDate.set(Calendar.DAY_OF_MONTH, 1);
            while (initialDate.before(finalDate)) {
                //adiciona um mês a data
                initialDate.add(Calendar.MONTH, 1);
                //adiciona na lista
                dates.add(new Date(initialDate.toInstant().toEpochMilli()));
            }
            //cria formato de saída
            SimpleDateFormat out = new SimpleDateFormat("yyyy-MM-dd");
            //passa cada data da lista imprimindo no console
            for (Date d : dates) {
                System.out.println(out.format(d));
            }
            return dates;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public List<Date> getRangeDateKai(String dataInicial, String dataFinal) {
        try {
            List<Date> lista = new ArrayList();
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            ZonedDateTime zdt = ZonedDateTime.of(LocalDate.now(), LocalTime.of(0, 0), ZoneId.systemDefault());
            LocalDate d1 = LocalDate.parse(dataInicial, dtf).with(ChronoField.DAY_OF_MONTH, 1);
            LocalDate d2 = LocalDate.parse(dataFinal, dtf).with(ChronoField.DAY_OF_MONTH, 1);
            lista.add(new Date(zdt.with(d1).toInstant().toEpochMilli()));
            while (d1.isBefore(d2)) {
                d1 = d1.plusMonths(1l);
                lista.add(new Date(zdt.with(d1).toInstant().toEpochMilli()));
            }
            lista.forEach(d -> System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(d)));
            return lista;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

Boa sorte a todos :metal::sunglasses::metal:

2 curtidas

Agradeço pela ajuda, eu tentei mais um pouco e conseguir fazer com Calendar ficou melhor, o método que você postou funciona também, muito obrigado pela contribuição.