182 votes

Comment itérer dans une plage de dates en Java ?

Dans mon script, j'ai besoin d'effectuer un ensemble d'actions sur une plage de dates, étant donné une date de début et de fin.
Veuillez me donner des conseils pour réaliser ceci en utilisant Java.

for ( currentDate = starDate; currentDate < endDate; currentDate++) {

}

Je sais que le code ci-dessus est tout simplement impossible, mais je le fais pour vous montrer ce que j'aimerais réaliser.

1voto

mridul4c Points 361

Pourquoi ne pas utiliser epoch et boucler facilement.

long startDateEpoch = new java.text.SimpleDateFormat("dd/MM/yyyy").parse(startDate).getTime() / 1000;

    long endDateEpoch = new java.text.SimpleDateFormat("dd/MM/yyyy").parse(endDate).getTime() / 1000;

    long i;
    for(i=startDateEpoch ; i<=endDateEpoch; i+=86400){

        System.out.println(i);

    }

1voto

jdev Points 2382

Vous pouvez écrire une classe comme elle (implémentant l'interface iterator) et itérer sur elle.

public class DateIterator implements Iterator<Date>, Iterable<Date>
{

 private Calendar end = Calendar.getInstance();
 private Calendar current = Calendar.getInstance();

 public DateIterator(Date start, Date end)
 {
     this.end.setTime(end);
     this.end.add(Calendar.DATE, -1);
     this.current.setTime(start);
     this.current.add(Calendar.DATE, -1);
 }

 @Override
 public boolean hasNext()
 {
     return !current.after(end);
 }

 @Override
 public Date next()
 {
     current.add(Calendar.DATE, 1);
     return current.getTime();
 }

 @Override
 public void remove()
 {
     throw new UnsupportedOperationException(
        "Cannot remove");
 }

 @Override
 public Iterator<Date> iterator()
 {
     return this;
 }
}

et l'utiliser comme :

Iterator<Date> dateIterator = new DateIterator(startDate, endDate);
while(dateIterator.hasNext()){
      Date selectedDate = dateIterator .next();

}

1voto

Pankaj Singh Points 11

Vous pouvez essayer ceci :

OffsetDateTime currentDateTime = OffsetDateTime.now();
for (OffsetDateTime date = currentDateTime; date.isAfter(currentDateTime.minusYears(YEARS)); date = date.minusWeeks(1))
{
    ...
}

0voto

zengr Points 14506

0voto

gumkins Points 591
long oneDayMilSec = 86400000; // number of milliseconds in one day
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

try {

    Date startDate = sdf.parse("2012-02-15");
    Date endDate = sdf.parse("2012-03-15");

    long startDateMilSec = startDate.getTime();
    long endDateMilSec = endDate.getTime();

    for(long d=startDateMilSec; d<=endDateMilSec; d=d+oneDayMilSec){
        System.out.println(new Date(d));
    }

} catch (ParseException e) {
    e.printStackTrace();
}

Sortie

Wed Feb 15 00:00:00 EET 2012
Thu Feb 16 00:00:00 EET 2012
Fri Feb 17 00:00:00 EET 2012
...
Tue Mar 13 00:00:00 EET 2012
Wed Mar 14 00:00:00 EET 2012
Thu Mar 15 00:00:00 EET 2012

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X