Calcul de nombre de jours ouvrés entre deux dates

Le
souka91 offline Hors ligne
Bonjour,

Je suis actuellement entrain de développer une application pour la gestion des congés et j'ai besoin de calculer le nombre de jours ouvrés entre la date de départ et la date de fin, mais je trouve des problèmes.
Voici une méthode que j'ai créé à partir d'un code que j'ai trouvé sur un site, mais le problème c'est qu'il calcule le nombre de jours y compris samedi et dimanche et ne prend pas en considération le if(calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SUNDAY )&& calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SATURDAY)) , je ne sais pas où le problème, si quelqu'un peut m'aider merci d'avance.

public int jourouvrable(Date date2, Date date1)
{
int compteur = 0;
Calendar calendar1= Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
long diff = Math.abs(date2.getTime() - date1.getTime());
long numberOfDay = (long)diff/86400000;
System.out.println("Le nombre de jour est : " + numberOfDay);
if(numberOfDay != 0){
for(int i=0;i<=numberOfDay;i++){
if(calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SUNDAY )&& calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SATURDAY))
compteur++;
calendar1.add(Calendar.DAY_OF_MONTH, 1);
}}
System.out.println("Le nombre de jour ouvrés est : " + compteur);
return compteur;
}
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Yliur
Le #26350539
Le Mon, 27 Apr 2015 09:46:03 -0500
souka91
Bonjour,

Je suis actuellement entrain de développer une application pour la
gestion des congés et j'ai besoin de calculer le nombre de jours
ouvrés entre la date de départ et la date de fin, mais je trouve des
problèmes. Voici une méthode que j'ai créé à partir d'un code que
j'ai trouvé sur un site, mais le problème c'est qu'il calcule le
nombre de jours y compris samedi et dimanche et ne prend pas en
considération le if(calendar1.get(Calendar.DAY_OF_WEEK) ! > (Calendar.SUNDAY )&& calendar1.get(Calendar.DAY_OF_WEEK) ! > (Calendar.SATURDAY)) , je ne sais pas où le problème, si quelqu'un
peut m'aider merci d'avance.
public int jourouvrable(Date date2, Date date1)
{
int compteur = 0;
Calendar calendar1= Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
long diff = Math.abs(date2.getTime() - date1.getTime());
long numberOfDay = (long)diff/86400000;
System.out.println("Le nombre de jour est : " + numberOfDay);
if(numberOfDay != 0){
for(int i=0;i<=numberOfDay;i++){
if(calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SUNDAY )&&
calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SATURDAY))
compteur++;
calendar1.add(Calendar.DAY_OF_MONTH, 1);
}}
System.out.println("Le nombre de jour ouvrés est : " + compteur);
return compteur;
}



Tu devrais tracer l'exécution de ta fonction : afficher chaque date
examinée avec "System.out.println (calendar1.getTime()) ;" et regarder
pour chacune si le test marche ou non.

À premier vue ça marche.

Par contre si tu utilises <= dans le test de la boucle le nombre de
jours examiné est différent du nombre de jours que tu as calculé à
l'avance.
Samuel DEVULDER
Le #26350558
Le 27/04/2015 17:52, Yliur a écrit :

Par contre si tu utilises <= dans le test de la boucle le nombre de
jours examiné est différent du nombre de jours que tu as calculé à
l'avance.



Oui pour moi le bug est dans le "<=" qui fait compter un jour en trop
(sauf si ce jour tombe un samedi ou dimanche, mais c'est indirect).

Le test à if(numberOfDay!=0) est lui aussi complètement inutile et
ressemble à une tentative de correction de ce que le "<=" produit pour
deux jours identiques.

Bref, il faut virer le test à numberOfDay!=0 et utiliser "<" dans la
boucle for() pour que ca marche à tous les coups.

Sinon question nommage, j'aurais mis un "s" pour le plurier à
numberOfDay(s).

a+

sam.
souka91 offline Hors ligne
Le #26350611
Le lundi 27 Avril 2015 à 16:46 par souka91 :
Bonjour,

Je suis actuellement entrain de développer une application pour la
gestion des congés et j'ai besoin de calculer le nombre de jours
ouvrés entre la date de départ et la date de fin, mais je trouve
des problèmes.
Voici une méthode que j'ai créé à partir d'un code
que j'ai trouvé sur un site, mais le problème c'est qu'il calcule
le nombre de jours y compris samedi et dimanche et ne prend pas en
considération le if(calendar1.get(Calendar.DAY_OF_WEEK) !=
(Calendar.SUNDAY )&& calendar1.get(Calendar.DAY_OF_WEEK) !=
(Calendar.SATURDAY)) , je ne sais pas où le problème, si
quelqu'un peut m'aider merci d'avance.

public int jourouvrable(Date date2, Date date1)
{
int compteur = 0;
Calendar calendar1= Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
long diff = Math.abs(date2.getTime() - date1.getTime());
long numberOfDay = (long)diff/86400000;
System.out.println("Le nombre de jour est : " + numberOfDay);
if(numberOfDay != 0){
for(int i=0;i<=numberOfDay;i++){
if(calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SUNDAY )&&
calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SATURDAY))
compteur++;
calendar1.add(Calendar.DAY_OF_MONTH, 1);
}}
System.out.println("Le nombre de jour ouvrés est : " +
compteur);
return compteur;
}


Bonjour,

Merci pour vous réponse, j'ai résolu le problème en mettant if(calendar1.get(Calendar.DAY_OF_WEEK) != 1 && calendar1.get(Calendar.DAY_OF_WEEK) != 7) avec le nombre 1 qui présente le dimanche et le 7 qui présente le samedi et j'ai effacé if(numberOfDay!=0) du code et ça marche maintenant, il me reste d'ajouter un traitement sur les jours féries s'il y a quelqu'un qui peut me donner une idée sur la façon de le faire.

Merci d'avance.
Denis Beauregard
Le #26350624
Le Tue, 28 Apr 2015 08:49:04 -0500, souka91
fr.comp.lang.java:

code et ça marche maintenant, il me reste d'ajouter un traitement sur les jours
féries s'il y a quelqu'un qui peut me donner une idée sur la façon de le faire.



Les fériés varient selon le pays. De plus, certains fériés le sont
pour certains organismes seulement. Par exemple, ici, on a des
fériés gouvernementaux qui ne sont pas partagés par l'entreprise
privée. Le but étant sans doute un calcul pour l'entreprise privée,
je suppose qu'il suffirait de trouver pour chaque région concernée
la liste des fériés. Notez qu'ici, on a aussi des fériés obligatoires
et d'autres qui peuvent être déplacés. Ainsi, si le 24 juin (fête
nationale du Québec) tombe un mercredi, il est obligatoire. Si le
1er juillet (fête nationale du Canada) tombe aussi le mercredi (ils
sont synchronisés !), on peut le prendre le lundi ou le vendredi
et c'est l'entreprise qui décide. Par contre, si on fait un calcul,
il suffit de compter 1 entre telle et telle date. Et qusnd c'est un
samedi ou un dimanche, on a encore le choix du jour du congé férié,
donc pour un calcul, cela n'a pas d'importance si ce n'est pas le
jour limite du calcul.

Autre exemple : la fête nationale en France n'est pas le même jour
que celle de Belgique ou de Suisse.


Denis

--
Denis Beauregard - généalogiste émérite (FQSG)
Les Français d'Amérique du Nord - www.francogene.com/genealogie--quebec/
French in North America before 1722 - www.francogene.com/quebec--genealogy/
Sur cédérom à 1785 - On CD-ROM to 1785
1connu
Le #26350626
Le 28. 04. 15 15:49, souka91 a écrit :
Le lundi 27 Avril 2015 à 16:46 par souka91 :
Bonjour,

Je suis actuellement entrain de développer une application pour la
gestion des congés et j'ai besoin de calculer le nombre de jours
ouvrés entre la date de départ et la date de fin, mais je trouve
des problèmes.
Voici une méthode que j'ai créé à partir d'un code
que j'ai trouvé sur un site, mais le problème c'est qu'il calcule
le nombre de jours y compris samedi et dimanche et ne prend pas en
considération le if(calendar1.get(Calendar.DAY_OF_WEEK) ! >> (Calendar.SUNDAY )&& calendar1.get(Calendar.DAY_OF_WEEK) ! >> (Calendar.SATURDAY)) , je ne sais pas où le problème, si
quelqu'un peut m'aider merci d'avance.

public int jourouvrable(Date date2, Date date1)
{
int compteur = 0;
Calendar calendar1= Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
long diff = Math.abs(date2.getTime() - date1.getTime());
long numberOfDay = (long)diff/86400000;
System.out.println("Le nombre de jour est : " + numberOfDay);
if(numberOfDay != 0){
for(int i=0;i<=numberOfDay;i++){
if(calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SUNDAY )&&
calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SATURDAY))
compteur++;
calendar1.add(Calendar.DAY_OF_MONTH, 1);
}}
System.out.println("Le nombre de jour ouvrés est : " +
compteur);
return compteur;
}


Bonjour,

Merci pour vous réponse, j'ai résolu le problème en mettant
if(calendar1.get(Calendar.DAY_OF_WEEK) != 1 &&
calendar1.get(Calendar.DAY_OF_WEEK) != 7) avec le nombre 1 qui présente le
dimanche et le 7 qui présente le samedi et j'ai effacé if(numberOfDay!=0) du
code et ça marche maintenant, il me reste d'ajouter un traitement sur les jours
féries s'il y a quelqu'un qui peut me donner une idée sur la façon de le faire.

Merci d'avance.



Il faut les gérer dans une base de données ou dans un fichier csv.
Par ex. 3 champs jour, mois, année à comparer avec calendar1 avant
d'incrémenter ton compteur
Yliur
Le #26350629
Le Tue, 28 Apr 2015 08:49:04 -0500
souka91
j'ai résolu le problème en mettant
if(calendar1.get(Calendar.DAY_OF_WEEK) != 1 &&
calendar1.get(Calendar.DAY_OF_WEEK) != 7) avec le nombre 1 qui
présente le dimanche et le 7 qui présente le samedi



À mon avis c'est une mauvaise idée : soit les constantes que tu
utilisais avaient bien ces valeurs et mieux vaut les utiliser (c'est
plus clair et si elles changent de valeur tout va continuer à marcher),
soit il y avait réellement un problème à ce niveau et le fait
d'utiliser les nombres de résout rien.

Le plus probable c'est que les nombres soient les mêmes sans les
constantes et que ça marchait très bien avec, tu devrais les garder.


et j'ai effacé
if(numberOfDay!=0) du code et ça marche maintenant, il me reste
d'ajouter un traitement sur les jours féries s'il y a quelqu'un qui
peut me donner une idée sur la façon de le faire.



Pas grand chose à ajouter à ce qui a été dit par ailleurs : il faut que
tu commences par une liste des jours fériés de ton pays et des règles
pour les calculer (date fixe, par rapport à autre chose, ...).
Yliur
Le #26350659
Le Tue, 28 Apr 2015 20:22:02 +0200
Samuel DEVULDER <samuel-dot-devulder-at-laposte-dot-net> a écrit :

Le 28/04/2015 17:37, Yliur a écrit :

> Pas grand chose à ajouter à ce qui a été dit par ailleurs : il faut
> que tu commences par une liste des jours fériés de ton pays et des
> règles pour les calculer (date fixe, par rapport à autre
> chose, ...).

Ca va être coton pour le lundi de pâques.. La formule n'est pas
simple. Et en plus, comme quelqu'un l'a déjà fait remarqué, ca n'est
probablement pas les jours fériés qu'il faut prendre en compte mais
les jours chômés. Il existe en effet des jours fériés non chômés en
France (Lundi de pentecôte, et peut être bientôt le 8 mai quand il
n'y aura plus de vétérans de WW2, ou que l'état voudra récupérer
quelques pourcentage de PiB).



Autre possibilité : entrer la liste des jours à la main pur chaque
année. Il se peut que ce soit aussi simple.
Denis Beauregard
Le #26350665
Le Tue, 28 Apr 2015 22:43:26 +0200, Yliur dans fr.comp.lang.java:

Autre possibilité : entrer la liste des jours à la main pur chaque
année. Il se peut que ce soit aussi simple.



Je me demande quelle est l'utilité d'un tel logiciel et j'ai
l'impression qu'on pourrait le faire pour l'année courante seulement,
donc saisir à la main l'année qui s'en vient, et ce serait suffisant,
en gardant les années précédentes et avec une année d'avance.


Denis

--
Denis Beauregard - généalogiste émérite (FQSG)
Les Français d'Amérique du Nord - www.francogene.com/genealogie--quebec/
French in North America before 1722 - www.francogene.com/quebec--genealogy/
Sur cédérom à 1785 - On CD-ROM to 1785
Yliur
Le #26350693
Le Wed, 29 Apr 2015 00:01:01 -0400
Denis Beauregard a écrit :

Le Tue, 28 Apr 2015 22:43:26 +0200, Yliur dans fr.comp.lang.java:

>Autre possibilité : entrer la liste des jours à la main pur chaque
>année. Il se peut que ce soit aussi simple.

Je me demande quelle est l'utilité d'un tel logiciel et j'ai
l'impression qu'on pourrait le faire pour l'année courante seulement,
donc saisir à la main l'année qui s'en vient, et ce serait suffisant,
en gardant les années précédentes et avec une année d'avance.



Oui, c'est à ça que je pensais. Ça devrait suffire pour sa gestion de
congés.
dewit44 offline Hors ligne
Le #26424888
Le lundi 27 Avril 2015 à 16:46 par souka91 :
Bonjour,

Je suis actuellement entrain de développer une application pour la
gestion des congés et j'ai besoin de calculer le nombre de jours
ouvrés entre la date de départ et la date de fin, mais je trouve
des problèmes.
Voici une méthode que j'ai créé à partir d'un code
que j'ai trouvé sur un site, mais le problème c'est qu'il calcule
le nombre de jours y compris samedi et dimanche et ne prend pas en
considération le if(calendar1.get(Calendar.DAY_OF_WEEK) !=
(Calendar.SUNDAY )&& calendar1.get(Calendar.DAY_OF_WEEK) !=
(Calendar.SATURDAY)) , je ne sais pas où le problème, si
quelqu'un peut m'aider merci d'avance.

public int jourouvrable(Date date2, Date date1)
{
int compteur = 0;
Calendar calendar1= Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
long diff = Math.abs(date2.getTime() - date1.getTime());
long numberOfDay = (long)diff/86400000;
System.out.println("Le nombre de jour est : " + numberOfDay);
if(numberOfDay != 0){
for(int i=0;i<=numberOfDay;i++){
if(calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SUNDAY )&&
calendar1.get(Calendar.DAY_OF_WEEK) != (Calendar.SATURDAY))
compteur++;
calendar1.add(Calendar.DAY_OF_MONTH, 1);
}}
System.out.println("Le nombre de jour ouvrés est : " +
compteur);
return compteur;
}

Soutien financier aux particuliers
Bonjour
Je voudrais vous faire part que j'octroie des prêts d'argent allant de 3.000 € à 800.000 € à toute personne capable de le rembourser sur une période de 1 à 25 ans avec des taux d'intérêt défiant toute concurrence. Je le fais dans les domaines suivants: prêt personnel, prêt immobilier, prêt à l'investissement , consolidation de la dette, prêt automobile , rachat de crédit, etc. Vous êtes fiché et vous êtes vraiment dans le besoin . Veuillez me contacter pour plus d'informations sur de très favorable conditions . Contact mail

Email:
Poster une réponse
Anonyme