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 


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.