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

API standards et tierces Java Discussion :

[Info] Jours ouvrés entre 2 dates [Sources]


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut [Info] Jours ouvrés entre 2 dates
    Bonjour à tous

    L'un de vous aurait-il dans ses archives Java, une méthode qui calcule le nombre de jours ouvrés entre deux dates, ou au moins une méthode pour déterminer le nombre de samedis, de dimanche, de fériés entre deux dates. J'en ai besoin pour mon projet et curieusement, je n'ai rien trouvé sur internet, mais je n'ai peut-être pas bien cherché.

    Un grand merci pour tous ceux qui répondront.

    [ Modéré par Bulbo ]
    Ajout d'un tag dans le titre
    Les Règles du Forum

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 34
    Par défaut
    J'ai une petite idée avec la classe GregorianCalendar (zou lien javadoc direct : http://javasearch.developpez.com/j2s...alendar.html).

    But de la manoeuvre :

    - Instancier deux instances de Date, une pour la première date, l'autre pour la seconde.
    - Tu initialise un compteur à 0 qui va te permettre de calculer le nombre de jours.
    - Tu boucles, et à chaque itération tu incrémente ton compteur si le DAY_OF_WEEK est de 6 ou 7 et tu fais un GregorianCalendar.roll(...) pour passer au jour suivant... et ainsi de suite, jusqu'à la date butoir ( la deuxième instance de date).


    Pour les jours fériés, pourquoi ne pas les stocker dans un tableau avec le numéro du jour de l'an pour chaque jour férié? Si le DAY_OF_MONTH est le même qu'un de tes jours fériés de tableau, t'incrémente le compteur ...


    J'espère que j'ai pu t'aider et surtout, JavaSearch en cas de pépin !

  3. #3
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    merci ...
    je suis surtout habitué à .NEt donc je vais tenter ta solution...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Tu peux aussi etre plus volontaire, et faire ca par une base de données...

    En gros, tu te fais un calendrier sur 20 ans, par exemple, et tu tagues toutes les entrées, en marquant le jour de la semaine par un numéro, de 1 a 7... Pour les jours fériés, il est facile de les rentrer au sein de ta base, et meme de faire des procedures d'update. A ce niveau la, ton probleme n'est plus qu'une requete de selection sur ta base...

    Le jour de la semaine peut etre facilement obtenu par un simple modulo 7.

    Eventuellement, tu peux meme faire une procedure permettant d'etendre directement ta base a partir du moment ou on demande une date en dehors de ce que tu as déjà changé, auquel cas, ajouter une année, ou 100, ou 1000, se fait tout aussi simplement, tant que les jours fériés ne changent pas...

    Un piège cependant, attention aux années bisextiles !

    Un collegue de boulot a fait un calendrier universel de cette manière, a des fins industrielles simplement sous Access (Désolé...), en 1 jour ...

  5. #5
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    N'oublie pas les fêtes basées sur le calendrier lunaire comme Pâques, l'Ascension et le fameux lundi de Pentecôte. ;-)

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Ben pour les fetes lunaires, ce n'est pas difficile par exemple de trouver le premier Dimanche d'un mois, au sein d'une requête... Donc ca se fait de la même manière...

  7. #7
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Citation Envoyé par ghorgor
    Ben pour les fetes lunaires, ce n'est pas difficile par exemple de trouver le premier Dimanche d'un mois, au sein d'une requête... Donc ca se fait de la même manière...
    Je suis intéressé à savoir comment tu détermines Pâques?

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Un peu de Math, et une joli methode...

    http://histoiredechiffres.neuf.fr/calendrier/paques.htm

    Sinon, il me semble qu'on avait récupéré sur un forum peu connu, sur un site inconnu aussi (www.developpez.com), le script en VB pour Access permettant directement d'avoir tout ca...

  9. #9
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    Pour paques, je sais faire, je l'ai fait en VB

    Soit m, l'année. On calcule successivement :
    1. le reste de m/19 : c’est la valeur de a.
    2. le reste de m/4 : c’est la valeur de b.
    3. le reste de m/7 : c’est la valeur de c.
    4. le reste de (19a + 24)/30 : c’est la valeur de d.
    5. le reste de(2b + 4c + 6d + 5)/7 : c’est la valeur de e.

    La date de Pâques est le (22 + d + e) mars ou le (d + e - 9) avril.

    Voici deux exemples dans le calendrier grégorien :

    En 1996, on trouve : a = 1, b = 0, c = 1, d = 13, e = 3. Pâques eut lieu le (13 + 3 - 9) = 7 avril.

    En 2020, on trouve : a = 6, b = 0, c = 4, d = 18, e = 3. Pâques aura lieu le (18 + 3 - 9) = 12 avril.

    Les jours fériés tels que l’ascension, le lundi de pentecôte et le lundi de pâques se calculent par rapport au jour de pâques. Si cela est évident pour le lundi de pâques, ça l’est moins pour les deux autres :

    - L’ascension à lieu 39 jours après pâques
    - Le lundi de pentecôte à lieu 49 jours après pâques

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Sinon, la méthode en VB, mais (désolé pour l'auteur), je n'ai plus la source tel quel :

    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
    Private Function JourDePaques(ByVal Iyear As Integer) As Date
            Dim L(6) As Long, Lj As Long, Lm As Long
     
            L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
            L(4) = (19 * L(1) + 24) Mod 30
            L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
            L(6) = 22 + L(4) + L(5)
     
            If L(6) > 31 Then
                    Lj = L(6) - 31
                    Lm = 4
            Else
                    Lj = L(6)
                    Lm = 3
            End If
     
            ' Lundi de Pâques = Paques 0 jour
            JourDePaques = DateAdd("d", 0, (Lj & "/" & Lm & "/" & Iyear))
     
    End Function

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Tant qu'on demande pas la fete des morts sumérienne, ou le culte du feu chez les draconistes bleus de carthagène, on doit toujours pouvoir s'en sortir...

    Dinytro, c'etait pas toi l'auteur du post en VB, avec la methode en question ?

  12. #12
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    Tu peux aussi etre plus volontaire, et faire ca par une base de données...
    j'avais pas vu cette remarque :

    1 - je ne vois pas en quoi ce serait "volontaire" de faire ça avec un ebase de donnée. la volontée, j'en ai mais je n'ai touché au java que 2 fois dans ma vie ! On m'aurait demandé ça en C++ ou C# ce serait fait depuis un moment !

    2 - Je ne vois pas trop l'interêt de créer une base de données pour faire un calcul sur des dates, surtout quand on a des outils comme ceux que propose java

    le but de mon post est d'apprendre à manipuler ces outils, rien de plus.

  13. #13
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    Voilà ce que j'ai fait .. j'ai pas trop le temps de tesetr mais ça à l'air de fonctionner.

    je le met là pour info, au cas où

    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
     
    GregorianCalendar d1 = new GregorianCalendar(2002,01,01);
        GregorianCalendar d2 = new GregorianCalendar(2004,01,01);
        System.out.println("YEAR: " + d1.get(Calendar.YEAR));
        Date dateferies[];
     
     
     
        //Ajoute dans la liste les jours de pentecotes et de l'ascension entre les 2 dates
        ArrayList list = new ArrayList();
        for(int annee = d1.getTime().getYear();annee<=d2.getTime().getYear(); annee++)
        {
     
          Date paqueDay = Paques(annee);
          //On ajoute pas paques, c'est un dimanche
     
          //ascension
          GregorianCalendar g = new GregorianCalendar(paqueDay.getYear(),paqueDay.getMonth(),paqueDay.getDay());
          g.add(Calendar.DATE,39);
          list.add(g.getTime());
     
          //pentecôte
          GregorianCalendar g2 = new GregorianCalendar(paqueDay.getYear(),paqueDay.getMonth(),paqueDay.getDay());
          g2.add(Calendar.DATE,49);
          list.add(g2.getTime());
        }
     
        while(d1.getTime().compareTo(d2.getTime()) < 0)
        {
          /**
           * Dimanche = 0 samedi = 6
           * Et oui contrairement au idées reçu, le premier jour de la semaine
           * c'est dimanche
           * */
          if(d1.getTime().getDay() == 6 || d1.getTime().getDay() == 0)
          {
            list.add(d1.getTime());
          }
          d1.add(Calendar.DATE,1);
        }
     
        System.out.println(list.size());
     
        /**
         * Affichage de la liste
         * y'a l'heure dedans mais bon, c'est assez simple de trier...
         */
        for(int i=0;i<list.size();i++)
          {
           System.out.println((Date)list.get(i)); 
          }
    merci à tous !

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Je te disais ca simplement parce qu'a mon avis, passer par le resultat d'une requete Select count(*) ... et récupérer le résultat est probablement plus rapide et plus simple a mettre en oeuvre, que de faire une boucle sur un ensemble de date, sur lesquels tu vas effectuer des tests et calculs sur chaque, (qui seront déjà fait et optimisé au sein de la DB) afin de savoir si le jour est un dimanche, un Samedi, ou un jour férié... Surtout que si tu as déjà les méthodes en VB, comme cela semble être le cas, les utiliser sur une base ne te posera pas trop de problème...

    Maintenant, si c'est juste pour manipuler des objets Java, fais toi plaisir... ceci dit, ca n'avait rien d'évident dans l'intitulé du post...

  15. #15
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    si c'est juste pour manipuler des objets Java, fais toi plaisir... ceci dit, ca n'avait rien d'évident dans l'intitulé du post...
    mais enfin, je ne comprend pas ton raisonnement...
    Il ne s'agit pas de manipuler des objets pour se faire plaisir....
    Je me vois mal aller chez le client et lui dire que je vais lui installer tout un ram dam de base de donnée pour faire un calcul entre 2 dates !

    j'ai mis le code, et il est loin d'être complexe à mon avis...

    Quand au sujet de mon post, effectivement il n'était pas précis sur la question, mais en lisant un peu plus loin, je pense que c'était clair ... enfin, d'autres ont compris visiblement...
    j'aurais déjà eu une base de donnée pour cette appli, effectiveemnt ta solution n'était pas idiote mais je ne vais tout de même pas la créer exprés...ce serait stupide

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/08/2006, 14h43
  2. [Dates] Nombre jours ouvrés entre deux dates
    Par Yali dans le forum Langage
    Réponses: 4
    Dernier message: 28/12/2005, 12h05
  3. Nombre de jours ouvrés entre 2 dates
    Par motlerang dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/12/2005, 13h25
  4. Nbre de jours ouvrés entre deux date
    Par lito74 dans le forum Access
    Réponses: 3
    Dernier message: 08/12/2005, 09h16
  5. Compter le nb de jours ouvrés entre 2 dates
    Par bugmenot dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 15/09/2005, 13h19

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