2 votes

Itérer sur toutes les semaines entre la date de début et la date de fin

J'ai deux objets Date, start et finish. Je veux les itérer sur une base hebdomadaire, c'est-à-dire que s'il y a exactement 4 semaines entre les deux (semaines calendaires, pas seulement 7 jours l'un après l'autre), je veux 4 itérations et dans chaque itération, je veux obtenir les dates réelles de début et de fin.

Je suis en train de bricoler un Iterable dans ce but, mais je me demande si cela ne pourrait pas être réalisé facilement avec, par exemple, Joda Time ou une méthode personnalisée intelligente. Merci d'avance !

EDIT : Je dois répéter que j'ai besoin de semaines comme dans un calendrier, pas de sept jours l'un après l'autre. Si ma date de début est un jour aléatoire de la semaine (par exemple le vendredi), ma première itération devrait contenir [vendredi,dimanche] et non [vendredi,vendredi+7 jours]. Solution postée en tant que réponse.

1voto

Grzegorz Gajos Points 443

Dans Java 9, il y a une fonction LocalDate.datesUntil méthode. Il existe également un moyen simple d'ajuster l'heure à l'intérieur des limites d'une semaine en utilisant la méthode Ajusteurs temporels .

    int numOfWeeks = 4;

    // First iteration with alignment
    LocalDate start = LocalDate.now();
    LocalDate endOfTheFirstWeek = start.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
    out.println(String.format("[%s,%s]", start, endOfTheFirstWeek));

    // Remaining iterations
    endOfTheFirstWeek
            .datesUntil(endOfTheFirstWeek.plusWeeks(numOfWeeks - 1), Period.ofWeeks(1))
            .forEach(it -> {
                LocalDate from = it.plusDays(1);
                LocalDate to = from.plusWeeks(1);
                out.println(String.format("[%s,%s]", from, to));
            });

0voto

razcor Points 355

Pour calculer en utilisant le calendrier et WEEK_OF_YEAR :

 int startWeek;
 int finishWeek;
 int diff;
 SimpleDateFormat sdf;
 Calendar cal;
 Calendar startCountingCal;
 Date startDate;
 Date finishDate;
 String startDateS = "01/01/2013";
 String finishDateS = "01/05/2013";

 sdf = new SimpleDateFormat("dd/MM/yyyy");

 startDate = sdf.parse(startDateS);
 finishDate = sdf.parse(finishDateS);

 cal = Calendar.getInstance();

 cal.setTime(startDate);
 startWeek = cal.get(Calendar.WEEK_OF_YEAR);    

 cal.setTime(finishDate);
 finishWeek = cal.get(Calendar.WEEK_OF_YEAR);

 diff = finishWeek - startWeek;

 startCountingCal = Calendar.getInstance();
 startCountingCal.setTime(startDate);   

 for (int i = 0; i < diff; i++) {

     if (i==0) {
        System.out.println("WEEK " + i + " start: " + sdf.format(startCountingCal.getTime()));
        startCountingCal.add(Calendar.DATE, 7);
        System.out.println("WEEK " + i + " start: " + sdf.format(startCountingCal.getTime()));  
    } else {
        System.out.println("WEEK " + i + " start: " + sdf.format(startCountingCal.getTime()));
        startCountingCal.add(Calendar.DATE, 7);
        System.out.println("WEEK " + i + " start: " + sdf.format(startCountingCal.getTime()));  
    }

}

Sortie :

WEEK 0 start: 01/01/2013
WEEK 0 start: 08/01/2013
WEEK 1 start: 08/01/2013
WEEK 1 start: 15/01/2013
WEEK 2 start: 15/01/2013
WEEK 2 start: 22/01/2013
WEEK 3 start: 22/01/2013
WEEK 3 start: 29/01/2013
....
etc.

J'espère que cela vous aidera !

0voto

gyabraham Points 799

Merci à tous, voici une solution qui répond à mes besoins (notez que l'ajout de sept jours à un jour donné ne produira pas une semaine calendaire dans la plupart des cas, seulement si c'est un lundi !) Ce code utilise l'API Joda Time.

private static List<Interval> getWeeks(final DateTime start, final DateTime finish)
{
    final int weekLeaps = Weeks.weeksBetween(start, finish).getWeeks();
    if (weekLeaps == 0) {
        return ImmutableList.of(new Interval(start, finish));
    } else {
        // We hop sundays at least once
        final ImmutableList.Builder<Interval> resBuild = ImmutableList.<Interval> builder();

        // First week
        DateTime wStart = start;
        DateTime wEnd = rollToWeekEnd(start);
        resBuild.add(new Interval(wStart, wEnd));

        // Other weeks
        for (int i = 0; i < weekLeaps; i++) {
            wStart = wEnd.plusSeconds(1);
            DateTime actWeekEnd = rollToWeekEnd(wStart);
            wEnd = actWeekEnd.isBefore(finish) ? actWeekEnd : finish;
            resBuild.add(new Interval(wStart, wEnd));
        }

        return resBuild.build();
    }
}

private static DateTime rollToWeekEnd(final DateTime from)
{
    return from.withDayOfWeek(DateTimeConstants.SUNDAY)
        .withHourOfDay(23)
        .withMinuteOfHour(59)
        .withSecondOfMinute(59)
        .withMillisOfSecond(0);
}

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