IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

calculer la différence entre deux dates en excluant les weekends


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut calculer la différence entre deux dates en excluant les weekends
    Bonjour à tous,

    je souhaiterai avoir la différences entre deux dates en jours mais en excluant les weekends, j'arrive à calculer le nombre de jours mais il compte le weekends avec , dans groegian calandar on trouve pas une fonction qui fait cette opération?si oui est ce que je peux avoir un exemple svp.
    j'ai cherché beaucoup sur internet mais il y a énormément de postes qui traitent le calcul entre deux dates mais j'en ai pas trouvé qui s'occupe ce problème en excluant les weekends et les jours fériés.

    merci d'avance pour vos réponses.
    cordialement,

  2. #2
    Membre expérimenté Avatar de ZnhaarX
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 146
    Par défaut
    Salut,

    Bah même si tu n'as pas de méthodes tu l'implémentes toi même.
    Tu fixes une date de début et une date de fin.
    Tu fais une boucle qui compte le nombre de jour entre ces deux dates (incrémentation d'un compteur) en vérifiant si il s'agit d'un jour particulier (samedi et dimanche) dans quel cas tu n'incrémentes plus ton compteur.
    Exemple de code que j'ai trouvé:
    http://www.simplyshareit.net/post-53...-holidays.html

    Et pour les jours fériés, tu fais une List<Date> des jours fériés dans l'année (ou sur plusieurs années) et tu vérifies qu'ils ne sont pas présents dans ton intervalle (DateDébut - DateFin).

    Tu n'as plus qu'à adapter tout ça et ça devrait être bon

    Bonne chance !

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    salut ZnhaarX merci pour ta réponse rapide je vais voir le lien que tu m'as donnée

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 130
    Par défaut
    Bonjour,

    Attention, pour les jours fériés français, une grande partie sont fixe (Noël, jour de l'an, 1e mai, 8 mai, 14 juillet, 15aout, 1e novembre, 11 novembre) et peuvent donc être inscrit de manière permanente dans le programme.

    Par contre, les jours, comme le lundi de pâques, le lundi de pentecôte, et le jeudi de l'ascension sont variables mais dépendent toutes de la date du dimanche de pâques qui est calculables : Calcul du dimanche de Paques

    lundi de paques = dimanche de paques + 1 jour
    ascension = dimanche de paques + 40 jours
    lundi de pentecote = dimanche de paques + 51 jours ou lundi de paques + 50 jours

    Pour info, quand j'avais fait un programme dans le même genre j'avais utilisé l'algorithme de Oudin. (un peu tordu, mais fiable)

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    Bonjour,
    j'ai créer une fonction qui me permettait de bien calculer le nombre de jour entre deux dates sans weekends et jours fériés, sauf que il y a les erreurs de calculs lorsque j’essaie par exemple la différence entre 27/03/2011 ET 28/03/2001
    il m'affiche 0jour je pense que ça vient de changement d'horaire.
    si quelqu'un trouve la solution je suis preneur voilà le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    import java.util.*;
     
     
     
    public class testFerie {
     
    	private static class Ferie
    	{
    		private static Vector<Date> joursFeries = new Vector<Date>() ;
    		private static int a,b,c,d,e,f,g,h,i,k,l,m,n,p;
     
    		private static Date getDimanchePaques(int year)
    		{
    			a = year%19;
    			b = year/100;
    			c = year%100;
    			d = b/4;
    			e = b%4;
    			f = (b+8)/25;
    			g = (b-f+1)/3;
    			h = (19*a+b-d-g+15)%30;
    			i = c/4;
    			k = c%4;
    			l = (32+2*e+2*i-h-k)%7;
    			m = (a+11*h+22*l)/451;
    			n = (h+l-7*m+114)/31;
    			p = (h+l-7*m+114)%31;
    			GregorianCalendar c = new GregorianCalendar() ;
    			c.set(c.get(Calendar.YEAR),n-1, p+1,0,0,0);
    			return c.getTime() ;
    		} 
     
    		public static void init()
    		{
    			joursFeries.removeAllElements() ;
    			GregorianCalendar c = new GregorianCalendar();
    			// 1er Janvier
    			c.set(c.get(Calendar.YEAR),0,1,0,0,0) ;
    			joursFeries.add(c.getTime());
    			// 1er mai
    			c.set(c.get(Calendar.YEAR),4,1,0,0,0) ;
    			joursFeries.add(c.getTime());
    			// 8 mai
    			c.set(c.get(Calendar.YEAR),4,8,0,0,0) ;
    			joursFeries.add(c.getTime());
    			// 14 juillet
    			c.set(c.get(Calendar.YEAR),6,14,0,0,0) ;
    			joursFeries.add(c.getTime());
    			// 15 aout assomption
    			c.set(c.get(Calendar.YEAR),7,15,0,0,0) ;
    			joursFeries.add(c.getTime());
    			// 1er novembre toussaint
    			c.set(c.get(Calendar.YEAR),10,1,0,0,0) ;
    			joursFeries.add(c.getTime());
    			// 11 novembre
    			c.set(c.get(Calendar.YEAR),10,11,0,0,0) ;
    			joursFeries.add(c.getTime());
    			// 25 decembre noel
    			c.set(c.get(Calendar.YEAR),25,11,0,0,0) ;
    			joursFeries.add(c.getTime());
    			Date dimanchePaques = getDimanchePaques(c.get(Calendar.YEAR));
    			// lundi de paques
    			joursFeries.add(new Date(dimanchePaques.getTime()+(24*60*60*1000)));
    			// jeudi de l'ascension
    			joursFeries.add(new Date(dimanchePaques.getTime()+(24*60*60*1000*39)));
    			// lundi de pentecote
    			joursFeries.add(new Date(dimanchePaques.getTime()+(24*60*60*1000*50)));		
    		}
     
    		public static boolean isFerie(Date date)
    		{
    			init() ;
    			boolean cont = true ;
    			for(int i=0;i<joursFeries.size() && cont;i++)
    				if(joursFeries.get(i).toString().equals(date.toString()))
    					cont = false ;
    			return !cont ;	
    		}
    	}
     
    	private static boolean isWE(Date date)
    	{
    		GregorianCalendar cal = new GregorianCalendar() ;
    		cal.setFirstDayOfWeek(Calendar.MONDAY) ;
    		cal.setTime(date) ;
    		int jour = cal.get(Calendar.DAY_OF_WEEK) ; 
    		return (jour==Calendar.SATURDAY || jour==Calendar.SUNDAY) ;
    	}
     
    	private static int calcul(Date debut, Date fin)
    	{
    		int nb = 0;
    		long finl = fin.getTime() ;
    		long debutl = debut.getTime() ;
    		long duree = (finl - debutl) / 1000 / 60 / 60 / 24 ;
    		System.out.println("duree="+duree) ;
    		for (long i = 0; i<= duree; i++)
    		{
    			Date d = new Date(debut.getTime()+(24*60*60*1000)*i) ;
    			System.out.print(d+" ; ");
    			boolean we = isWE(d) ;
    			boolean ferie = Ferie.isFerie(d) ;
    			if(!(we||ferie))
    			{
    				nb += 1 ;
    				System.out.println("IN");
    			}
    			else
    				System.out.println("OUT");
    		}
    		return nb ;
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		GregorianCalendar c = new GregorianCalendar();
    		c.set(2011,2,28,0,0,0) ;
    		Date debut = c.getTime() ;
    		c.set(2011,2,28,0,0,0) ;
    		Date fin = c.getTime() ;
    		int duree = calcul(debut, fin) ;
    		System.out.println("Duree = "+duree+"j");
     
    	}
     
    }

    cordialement,

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    À mon avis, il ne faut pas passer par la différence en millisecondes.

    Il faut partir du premier Calendrier, et lui ajouter un jour jusqu'à ce que sa Date atteigne la Date du second calendrier. Chaque fois qu'on fait ça, vérifier si on arrive sur un week-end ou jour férié, et si oui, ne pas le compter.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je suis pas expert et j'ai pas analysé le code en détail (qui m'a l'air inutilement compliqué) mais entre le 28 février 2011 et le 28 février 2011, il y a effectivement 0 jours .

    Ceci dit:

    tout votre code manipule des Date, c'est Mal. Comme on vous l'a dit, construise un Calendar et utiliser le Calendar. Les objets Date sont beaucoup plus dur à comparer.

    Donc en gros

    1) créer le Calendar de base
    2) boucle "ajouter un jour".
    2*) si Day of week dans weekend (attention, dans certains payx weekend = dimanche-lundi et dans d'autre vendredi-samedi!) ou si dayofweek férié -> ne pas incrémenter le compteur jours

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] calculer la différence entre deux dates en minutes
    Par sarah12 dans le forum IHM
    Réponses: 5
    Dernier message: 20/07/2010, 15h44
  2. Calculer une différence entre deux dates
    Par attif0709 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/04/2010, 12h06
  3. [AC-2003] Calcul de différence entre deux dates : problème de format
    Par sinifroth dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/01/2010, 15h35
  4. Calcul de différence entre deux dates cas vaut 0
    Par zanoubya dans le forum Débuter
    Réponses: 3
    Dernier message: 25/12/2008, 19h45
  5. Calculer la différence entre deux dates
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 18/12/2007, 08h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo