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

C Discussion :

Nombre de MOIS entre deux dates


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut Nombre de MOIS entre deux dates
    Bonjour,

    le C n'est pas ma spécialité, avant de poser ma question j'ai longuement cherché ici une réponse à ma question, en vain.
    Au fait j'ai besoin de calculer, en C, la différence entre deux dates en "mois" ?
    J'ai bien vu dans la rubrique http://c.developpez.com/sources/?pag...ATE_difference la fonction qui donne cette différence en jours mais ce qu'il me faut est en mois.

    Je ne peux pas, non plus, utiliser cette dernière en divisant par 30 jours par exemple car il faut être précis, puisque le mois peut être 28, 29,30,31 donc je cherche plutôt une fonction qui se base sur les mois écoulés entre les 2 dates, et non pas les jours écoulés, pour éviter les ambiguités.

    Merci d'avance pour votre aide
    JMR

    Rq: Voici la fonction qui calcule le nombre de jour personnalisé légèrement pour mon code, elle me calcule le nombre de jours, elle est parfaite pour ça, il me manque cependant une autre pour les mois, ou éventuellement transformer celle ci pour qu'elle calcule les mois, mais je ne sais pas trop si c'est la bonne démarche :
    ----------------------------------------------------------------------------------
    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
    #include <string.h> 
    #include <stdlib.h> 
    #include <stdio.h> 
     
    /* l'année est-elle bissextile*/
    int Bissextile (int A)
    {
      return A % 4 == 0 && (A % 100 != 0 || A % 400 == 0);
    }
     
    /*combien de jours se sont ecoules depuis le debut de l'annee donnee*/
    int Nb_Jours (int J, int M, int A)
    {
      int i, D = 0;
      const int Mois[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
     
      if (M == 1)
      {
        D = J;
      }
      else
      {
        for (i = 0; i < (M-1); i++)
        {
          D += Mois[i];
        }
        D+=J;
      }
      if ((M > 2) && (Bissextile(A)))
      {
        D++;
      }
      return D;
    }
     
    /*la fonction diff proprement dite*/
    int Diff (int j1, int m1, int a1, int j2, int m2, int a2)
    {
      int NJ = 0, NJ1, NJ2, i;
     
      NJ1 = Nb_Jours (j1, m1, a1);
      NJ2 = Nb_Jours (j2, m2, a2);
      if (a2 == a1)
      {
        NJ = NJ2 - NJ1;
      }
      else
      {
        for (i = 0; i < (a2-a1); i++)
        {
          NJ += 364;
          if (Bissextile (a1+i))
          {
            NJ++;
          }
        }
        NJ -= NJ1;
        NJ += NJ2+1;
      }
      return NJ;
    }
     
    /* fonction substring pour extraire les sous chaines */
     
    char* substring(const char* str, size_t begin, size_t len) 
    { 
      if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len)) 
        return 0; 
     
      return strndup(str + begin, len); 
    } 
     
     
    /****************************************************************/
    /* Fonction diff_dates_en_jours : clacule le nombre de jours   */
    /* qui sépare deux dates, en tenant compte des années bissextiles */
    /****************************************************************/
    int diff_dates_en_jours(char date_debut_contrat[8+1],char date_fin_contrat[8+1])
    {
     
      const char* date1    = date_debut_contrat;       
      char*       annee1 = substring(date1, 0, 4); 
      char*       mois1 = substring(date1, 4, 2); 
      char*       jour1 = substring(date1, 6, 2); 
     
      const char* date2    = date_fin_contrat;        
      char*       annee2 = substring(date2, 0, 4); 
      char*       mois2 = substring(date2, 4, 2); 
      char*       jour2 = substring(date2, 6, 2); 
     
      int nombre_jours= Diff (atoi(jour1), atoi(mois1), atoi(annee1),atoi(jour2), atoi(mois2), atoi(annee2));
     
      free(annee1); 
      free(mois1); 
      free(jour1); 
     
      free(annee2); 
      free(mois2); 
      free(jour2); 
     
        return nombre_jours;  
    }                                
     
    /****************************************************************/
    /* appel diff_dates_en_jours*/
    /****************************************************************/
     
    int main (void)
    {
       int calcul=0;
       calcul=diff_dates_en_jours ("20100105","20100127");
       printf("calcul = %d ! \n", calcul);
     
       return 0;  
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Je ne peux pas, non plus, utiliser cette dernière en divisant par 30 jours par exemple car il faut être précis, puisque le mois peut être 28, 29,30,31 donc je cherche plutôt une fonction qui se base sur les mois écoulés entre les 2 dates, et non pas les jours écoulés, pour éviter les ambiguités.
    Justement, comme tu le dis toi-même, un mois n'a pas de longueur fixée, cela varie. Le résultat ne sera donc jamais précis.
    Quel est le but de ce besoin (de calculer le nombre de mois entre deux dates) ? Calculer le nombre de jours ne conviendrait vraiment pas ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut
    Merci jeroman,
    alors le besoin est pour un calcul de prêts, ils veulent le nombre de jours et le nombre de mois. Le nombre de jours est utile quand il s'agit de quelques jours donc inférieur à un mois, au delà ils utilisent le mois comme unité, il me semble que c'est parce que il y a les taux d'intérêt journalier, mensuel, etc.

    bien cordialement



    Citation Envoyé par jeroman Voir le message
    Salut

    Justement, comme tu le dis toi-même, un mois n'a pas de longueur fixée, cela varie. Le résultat ne sera donc jamais précis.
    Quel est le but de ce besoin (de calculer le nombre de mois entre deux dates) ? Calculer le nombre de jours ne conviendrait vraiment pas ?

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Si je comprend ton problème, il est plus simple à résoudre que d'obtenir le nombre de jours si tu connais les dates sous le format jour/mois/année : c'est indépendant de la durée de chaque mois.

    Un exemple est plus parlant :

    Combien de mois complets entre le 16 février 2000 et le 10 novembre 2007 ?

    - de début mars 2000 à fin décembre 2000 : 12-3+1 = 10
    - de début janvier 2001 à fin décembre 2006 : (2006-2001+1)*12 = 6*12 = 72
    - de début janvier 2007 à fin octobre 2007 : 10-1+1 = 10

    Total 92 mois

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut
    Merci diogene,

    Au fait non, ils veulent aussi tenir compte des jours qui restent, c.a.d, pour ton exemple, du 16 fév à fin fév donc 28(ou 29)-16+1 =13 (ou 14) de 2000 et les 10 jours de nov 2007, soit en tous 23 (ou 24) est inférieur à un mois, mais si ce nombre total est 40 jours par exemple eh bien il faut tenir compte du mois qui est dans ces 40 jours.
    Au fait l'idée est de trouver ( coder ) une fonction en C qui serait équivalente à months_between d'Oracle, je sais que l'algo de months_between se base sur le fait que pour les jours qui restent elle divise par 31 pour pouvoir ajouter la fraction de mois en question, elle fait donc un choix ( car quelqu'un d'autre peut choisir 30 jours par exemple au lieu de 31 jours ), je pense qu'il faut dans tous les cas passer par un choix de ce genre.

    En tous cas pour mon problème, après discussion avec les collègues, finalement le nombre de mois n'est pas nécessaire, du coup je ne sais pas trop si je ferme la discussion ou pas, ou je laisse ouverte, car la ou les réponses éventuelles seraient utiles à d'autres, qu'en pensez vous ?

    Cordialement

    Citation Envoyé par diogene Voir le message
    Si je comprend ton problème, il est plus simple à résoudre que d'obtenir le nombre de jours si tu connais les dates sous le format jour/mois/année : c'est indépendant de la durée de chaque mois.

    Un exemple est plus parlant :

    Combien de mois complets entre le 16 février 2000 et le 10 novembre 2007 ?

    - de début mars 2000 à fin décembre 2000 : 12-3+1 = 10
    - de début janvier 2001 à fin décembre 2006 : (2006-2001+1)*12 = 6*12 = 72
    - de début janvier 2007 à fin octobre 2007 : 10-1+1 = 10

    Total 92 mois

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Au fait non, ils veulent aussi tenir compte des jours qui restent, c.a.d, pour ton exemple, du 16 fév à fin fév donc 28(ou 29)-16+1 =13 (ou 14) de 2000 et les 10 jours de nov 2007, soit en tous 23 (ou 24) est inférieur à un mois, mais si ce nombre total est 40 jours par exemple eh bien il faut tenir compte du mois qui est dans ces 40 jours.
    ça ne change pas grand chose sur le principe et ne complique pas beaucoup.
    Toutefois, cela montre une incohérence dans la demande en impliquant de fait une durée "standard" pour un mois (ce que tu soulignes plus loin)

    En tous cas pour mon problème, après discussion avec les collègues, finalement le nombre de mois n'est pas nécessaire, du coup je ne sais pas trop si je ferme la discussion ou pas, ou je laisse ouverte, car la ou les réponses éventuelles seraient utiles à d'autres, qu'en pensez vous ?
    Je pense que tu peux clore la discussion puisque les conditions précises du problème sont indéterminées (et que le problème est caduc)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut
    Ok je clos la discussion
    Merci encore

    Citation Envoyé par diogene Voir le message
    ça ne change pas grand chose sur le principe et ne complique pas beaucoup.
    Toutefois, cela montre une incohérence dans la demande en impliquant de fait une durée "standard" pour un mois (ce que tu soulignes plus loin)

    Je pense que tu peux clore la discussion puisque les conditions précises du problème sont indéterminées (et que le problème est caduc)

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

Discussions similaires

  1. [SQL] Calcul du nombre de mois entre deux dates
    Par Lolie11 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/03/2009, 11h46
  2. Récupérer le nombre de mois entre deux dates
    Par winow dans le forum C++Builder
    Réponses: 2
    Dernier message: 23/08/2008, 23h17
  3. Différence en nombre de mois entre deux dates
    Par seblo_scoqi dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/05/2007, 12h26
  4. [Dates] nombre de mois entre deux dates
    Par Mat_DZ dans le forum Langage
    Réponses: 14
    Dernier message: 23/11/2006, 16h10
  5. Nombre de mois entre deux dates
    Par boulaxx dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 14/09/2006, 15h22

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