[java] intervalle entre 2 dates sans compter les weekends

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 088 fois - Téléchargée 18 fois

Contenu du snippet

Calculer l'intervalle entre 2 dates sans compter les weekends

Principe:
1. Chercher le samedi de la même semaine a 00:00:00 pour la date de début et de fin
2. Compter combien de semaines ça fait.
3. Multiplier le nb de semaine par la durée de 5 jours entier en millisecondes
4. Identifier si la date de début est avant le samedi de la même semaine
5. Identifier si la date de fin est avant le samedi de la même semaine
6
Si date de début avant samedi
Ajouter le temps manquant à la somme trouvée à l'étape 3.
Si date de fin avant samedi
Enlever le temps en trop à la somme trouvée à l'étape 3.

Source / Exemple :


package ch.vd.damona.common.util.hibernate;

import java.util.Calendar;
import java.util.Date;

public final class DateUtils2 {

    public static final long MILISECOND_PER_DAY = 24 * 60 * 60 * 1000;

    public static final long MILLISECOND_WORKING_DAYS =  MILISECOND_PER_DAY * 5;

    private DateUtils2() {

    }

    public static long intervalleEnMillisSansWeekend(Date dateBegin, Date dateEnd) {
        Date dateBeginAtSaturday0 = findSaturdayAtSameWeekAtZero(dateBegin);
        Date calEndAtSaturday0 = findSaturdayAtSameWeekAtZero(dateEnd);

        long intervalleEnMillis = intervalleEnMillis(dateBeginAtSaturday0, calEndAtSaturday0);
        long nbSemaines = Double.valueOf(Math.floor(Long.valueOf(intervalleEnMillis).doubleValue() / 604800000)).longValue();

        long workingDaysInMillis =  nbSemaines * MILLISECOND_WORKING_DAYS;

        boolean isBeginBeforeSaturday = dateBeginAtSaturday0.getTime() - dateBegin.getTime() > 0;
        boolean isEndBeforeSaturday = calEndAtSaturday0.getTime() - dateEnd.getTime() > 0;

        long correctionInMillis = 0;

        if(isBeginBeforeSaturday) {
            correctionInMillis-= (dateBeginAtSaturday0.getTime() - dateBegin.getTime());
        }

        if(isEndBeforeSaturday) {
            correctionInMillis+= (calEndAtSaturday0.getTime() - dateEnd.getTime());
        }
        return workingDaysInMillis - correctionInMillis;

    }

    public static long intervalleEnJoursSansWeekend(Date dateBegin, Date dateEnd) {
        long intervalleEnMillis = intervalleEnMillisSansWeekend(dateBegin, dateEnd);
        long nbJours = Double.valueOf(Math.floor(Long.valueOf(intervalleEnMillis).doubleValue() / 86400000)).intValue();
        return nbJours;
    }

    public static Date findSaturdayAtSameWeekAtZero(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);

        switch (cal.get(Calendar.DAY_OF_WEEK)) {
            case Calendar.MONDAY :
                cal.add(Calendar.DAY_OF_MONTH, 5);
                break;
            case Calendar.TUESDAY :
                cal.add(Calendar.DAY_OF_MONTH, 4);
                break;
            case Calendar.WEDNESDAY :
                cal.add(Calendar.DAY_OF_MONTH, 3);
                break;
            case Calendar.THURSDAY :
                cal.add(Calendar.DAY_OF_MONTH, 2);
                break;
            case Calendar.FRIDAY :
                cal.add(Calendar.DAY_OF_MONTH, 1);
                break;
            case Calendar.SUNDAY :
                cal.add(Calendar.DAY_OF_MONTH, -1);
                break;
        }
        return cal.getTime();
    }

    public static long intervalleEnMillis(Date dateBegin, Date dateEnd) {
        return (dateEnd.getTime() - dateBegin.getTime());
    }
 }

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.