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

Langage Delphi Discussion :

nombre exact de mois entre deux dates calendaires?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut nombre exact de mois entre deux dates calendaires?
    salut
    est ce qu'il y'a une fonction en delphi qui renvoi le nombre exacte d'années,mois,jours entre deux dates calendaires, même si la date est passé par exemple entre 02/03/2004 et 05/07/2005:
    il faut qu'il me donne 15 mois/calendrier+35jours, que je dois le convertir moi (en considérant qu'un mois égal à 30 jrs) en 16 mois et 5 jours (ou peut être: 1 an et 4 mois et 5 jours)
    si non comment je peux le faire?
    merci

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    essaye DaysBetween et ses frères !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par dj_techno Voir le message
    salut
    est ce qu'il y'a une fonction en delphi qui renvoi le nombre exacte d'années,mois,jours entre deux dates calendaires, même si la date est passé par exemple entre 02/03/2004 et 05/07/2005:
    il faut qu'il me donne 15 mois/calendrier+35jours, que je dois le convertir moi (en considérant qu'un mois égal à 30 jrs) en 16 mois et 5 jours (ou peut être: 1 an et 4 mois et 5 jours)
    si non comment je peux le faire?
    merci
    je ne trouve pas daysbetween dans le help delphi F1

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Salut;

    plus de détails stp. Tes données proviennent d'une table de données? saisi à la main dans des edit? de quel types de données s'agit-il?

    Bonne chance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 669
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 669
    Points : 7 018
    Points
    7 018
    Par défaut
    Citation Envoyé par Aide Delphi
    Renvoie le nombre de jours entiers séparant deux valeurs TDateTime spécifiées.

    Unité

    DateUtils

    Catégorie

    routines date/heure

    function DaysBetween(const ANow, AThen: TDateTime): Integer;

    Description

    Appelez DaysBetween pour obtenir la différence, en jours, entre deux valeurs TDateTime.

    DaysBetween ne compte que les jours entièrement écoulés. Ainsi, DaysBetween renvoie 0 pour la différence entre le 31 décembre 1999 23h59 et le 1er janvier 2000 23h58 car il manque une minute pour que la différence soit d'un jour entier.
    Pour les mois, voir MonthsBetween, ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    les dates sont stockées dans une base, mais il y'a un calcul avant le stockage l'utilisateur doit saisir une date début (dbedit1) et une date fin (dbedit2) qui vont être stocké avec leurs différence exacte biensûre.

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    j'ai ajouté dateutils dans uses mais cette unité n'existe pas?

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyDaysBetween(First, Last: TDateTime): Cardinal;
    begin
      Result:=Trunc(Double(Last)-Double(First));
    end;
    rapidement concocté...

    [EDIT] et avec un petit coup de StrToDateTime pour coder Last à partir de 02/05/2008...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Re;

    mais tu ne dis toujours pas quels sont les types de données?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Kelloucheaeh Voir le message
    Re;

    mais tu ne dis toujours pas quels sont les types de données?
    pas compris, les types de données sont saisie par l'utilisateur et sont de tdatetime

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyDaysBetween(First, Last: TDateTime): Cardinal;
    begin
      Result:=Trunc(Double(Last)-Double(First));
    end;
    rapidement concocté...

    [EDIT] et avec un petit coup de StrToDateTime pour coder Last à partir de 02/05/2008...
    result va contenir quoi exactement, pouvez vous mieu expliquer?

  12. #12
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    la partie entière d'un TDateTime (il est stocké comme un réel du type Double) correspond au nombre de jours écoulés depuis une date de référence : 12/30/1899 12:00 am

    en faisant la différence entière de 2 TDateTime pris comme réels, on obtient le nombre de jours les séparant. (comme TDateTime est déclaré comme Double, on peut même se passer du transtypage)

    il faudrait bien sûr tester que Last est postérieur à First, ou prendre la valeur absolue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function MyDaysBetween(First, Last: TDateTime): Cardinal;
    begin
      Result:=Trunc(Abs(Last-First));
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 551
    Points : 25 124
    Points
    25 124
    Par défaut
    Le Trunc va juste retirer la partie Time, il faut savoir que la partie entière d'un TDateTime est exprimé en nombre de jour écoulé depuis le 01/01/1900 donc si tu soustraits deux valeurs, tu obtiens forcément la différence en nombre de jour entre deux dates ...
    Maintenant, MonthBetween ou SpanMonth de DateUtils, fournisse des valeurs approximatives en se basant sur une mois de 30,4 jours, ce qui donnera forcément une valeur fausse si l'intervalle comprend un mois de février et que l'intervalle est court (par exemple entre 2008-01-01 et 2008-01-01, il n'y a pas de mois écoulé, mais que 28 jours donc moins que 30), ... mais tu semblais déjà parti sur une solution approximative donc autant utiliser MonthSpan... sinon, une boucle, qui incremente mais c'est lourd !

    Citation Envoyé par DateUtils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    const
      { average over a 4 year span }
      ApproxDaysPerMonth: Double = 30.4375;
      ApproxDaysPerYear: Double  = 365.25;
     
    function MonthSpan(const ANow, AThen: TDateTime): Double;
    begin
      Result := DaySpan(ANow, AThen) / ApproxDaysPerMonth;
    end;
     
    function MonthsBetween(const ANow, AThen: TDateTime): Integer;
    begin
      Result := Trunc(MonthSpan(ANow, AThen));
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  14. #14
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    bonjour
    bon j'ai compris se que vous venez de suggerer, mais le probléme c'est que mon application doit exactement calculer le nombre de mois entre deux dates calendaires,
    je vais mieux expliquer, mon application est pour la gestion des ressources humaines ou ou il y'a une rubrique "contracts", dans cette rubrique il y'a des saisie des dates de début et de fin de contract, chaque personne peut avoir plus qu'un contract (1, 2 ou plus), mais leurs cumul de mois ne doit pas passer 45 mois selon la calendrier, donc il faut prendre en considération les mois ou il y'a 31 jours,30 jours et 28 ou 29 jours le cas de février.
    Je ne sais pas comment réaliser sa, j'ai fais une simple soustraction des dates en ajoutant 1 ou résultat, mais je dois avoir le résultat selon la calendrier exactement en nombre de mois, aussi je n'arrive pas à utiliser DateUtils et comment l'intégrer, je travaille avec delphi 5 et DateUtils n'existe pas.
    merci

  15. #15
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    un algo de ce type devrait convenir, non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nbannees := yearof(fin) -yearof(debut);
    nbmois := monthof(fin) -monthof(debut)
     
    result := nbannees*12 + nbmois;
    Êdit: pour delphi 5, yearof et monthof peuvent être simulés par des decodedate, en ne récupérant que l'année ou que le mois.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  16. #16
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Bonjour,
    SVP, avec Delphi 5 ou je peux trouver l'unité DateUtils pour l'ajouter dans Uses de mon application, car j'ai mis dateutils dans uses mais il ne l'a pas reconnu.
    merci

  17. #17
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    il n'existe pas avec Delphi 5.

    As-tu essayé le code précdédent en utilisant DecodeDate?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  18. #18
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Linkin Voir le message
    un algo de ce type devrait convenir, non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nbannees := yearof(fin) -yearof(debut);
    nbmois := monthof(fin) -monthof(debut)
     
    result := nbannees*12 + nbmois;
    Êdit: pour delphi 5, yearof et monthof peuvent être simulés par des decodedate, en ne récupérant que l'année ou que le mois.
    voici mon 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
    procedure Tadm.ADOTableembBeforePost(DataSet: TDataSet);
    var
    datedeb,datefin: tdatetime;
    andeb,anfin,moisdeb,moisfin,jrsdeb,jrsfin,result,nbremois,nbrean:word;
    begin
    if (dbedit1.Text<>'') and (dbedit2.Text<>'') then
    begin
    datedeb:=strtodate(dbedit1.text);
    datefin:=strtodate(dbedit2.text);
    decodedate(datedeb,andeb,moisdeb,jrsdeb);
    decodedate(datefin,anfin,moisfin,jrsfin);
    nbremois:=moisfin-moisdeb;
    nbrean:=anfin-andeb;
    result:=nbrean*12+nbremois;
    adotableemb.Fields[7].AsCurrency:=result;
    end;
    end;
    bon il fonctionne bien, mais la valeur n'est pas exacte 100%, pour mois je veux que la différence entre date sois exacte et calendaire c'est à dire en année et mois et jours, par exemple si il n'y a pas d'année on mets zero est ce que je dois faire comme ca:
    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
    procedure Tadm.ADOTableembBeforePost(DataSet: TDataSet);
    var
    datedeb,datefin: tdatetime;
    andeb,anfin,moisdeb,moisfin,jrsdeb,jrsfin,result,nbremois,nbrean,nbrejrs:word;
    begin
    if (dbedit1.Text<>'') and (dbedit2.Text<>'') then
    begin
    datedeb:=strtodate(dbedit1.text);
    datefin:=strtodate(dbedit2.text);
    //adotableemb.Fields[7].AsCurrency:=1+(datefin-datedeb);*)
    decodedate(datedeb,andeb,moisdeb,jrsdeb);
    decodedate(datefin,anfin,moisfin,jrsfin);
    nbremois:=moisfin-moisdeb;
    nbrean:=anfin-andeb;
    nbrejrs:=jrsfin-jrsdeb;
    end;
    end;
    et afficher nbrean,nbremois et nbrejrs pour qu'il y aura une valeur exacte.
    merci

  19. #19
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Donc tu veux le nombre de mois, avec des virgules pour le nombre de jour c'est ça?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  20. #20
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Donc tu veux le nombre de mois, avec des virgules pour le nombre de jour c'est ça?
    par exemple, si date_debut est 02/05/2001 et date_fin est 03/07/2002 je veux:
    13 mois et 33 jrs ----> ici si je veux arrondir les jours, je vais prendre pour 30 jrs sont un moi,
    donc j'ai:
    14 mois 3jours qui sont 1 an 2 mois 3 jours
    vous me comprenez maintenant

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