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

 Delphi Discussion :

Incrémenter des dates de 5 en 5


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Par défaut Incrémenter des dates de 5 en 5
    Je recherche une solution pour incrémenter une date de 5 jours en 5 jours sur une période de 3 mois. Cela pourrait être simple si les mois avaient tous 30 jours !

    la date de départ est la date du jour soit le 23/03/2015.
    la date qui suit la date de départ sera le 25/03/2015
    Ensuite le 31/03/2015.
    Ensuite le 05/04/2015.
    Ensuite le 10/04/2015.
    Ensuite le 15/04/2015.
    Ensuite le 20/04/2015.
    Ensuite le 25/04/2015.
    Ensuite le 30/04/2015.
    Ensuite le 05/05/2015.
    et ainsi de suite pendant 3 mois

    J'ai beaucoup de mal à m'orienter sur le départ d'une fonction.
    Je vous remercie de votre aide pour me mettre sur une piste.

    Cordialement
    Patrick

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 026
    Par défaut Ajouter des jours
    Bonjour,

    par exemple
    function IncDay(ADate: TDateTime; Days: Integer = 1) : TDateTime

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    Il suffit de convertir la chaîne en TDateTime, de lui ajouter 5 (un TDateTime est un réel dont la partie entière correspond à un nombre de jours écoulés depuis une date de référence), et de reconvertir au format souhaité.
    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 !

  4. #4
    Membre expérimenté
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Par défaut
    la doc du format "date" du langage quie tu utilises, comme dit précédemment, t'aidera à faire ce genre de calcul ...

    pour réinventer une roue carrée :

    en initialisant le fait que tous les 4 ans c'est une année bissextile ...
    et que tu te crées un tableau du genre [31,28,31,30,...] et [31,29,31,30,...]

    ex :
    initAn29 = 2012
    mois28 = [31,28,31,30,...]
    mois29 = [31,29,31,30,...]

    date = "25/02/2015"

    //extraction jour, mois et année :

    curJour = 25
    curMois = 2
    curAn = 2015

    //on prend le bon tableau:

    si (curAn-initAn29 "modulo" 4) = 0 :
    alors moisTab = mois29
    sinon moisTab = mois28

    et ensuite tu fais ton petit calcul en ajoutant "5 jours" jusqu'à la fin de chaque mois sinon la différence sur le mois d'après si cela dépasse.
    tu mets à jour la variable "date" et tu recommence tant que tu veux

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Par défaut
    Bonjour à vous,

    Je vous remercie pour vos réponses.

    @sweetasnz : Merci pour l'indication d'initialiser sur une année bissextile.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Tout dépend de la version de Delphi (incday n'est apparu qu'avec D5 il me semble) cependant c'est LA fonction à utiliser.
    En admettant que DateDepart est bien une date et selon la liste des dates indiquées s'agit-il vraiment d'une incrémentation de 5 jours

    dans ce cas la fonction IncDay suffit

    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
    uses .. DateUtils;
     
    procedure listedate;
    var aa,mm,mm1,jj : Word;
        d : TDateTime;
    begin
      D := EncodeDate(15,03,23);
      DecodeDate(d,aa,mm,jj);
      mm1:=mm;
      repeat
        Memo1.Lines.Add(FormatDateTime('dd/mm/yy',D));
        d:=IncDay(D,5);
        DecodeDate(D,aa,mm,jj);
      until (mm>mm1+3);  
    end;
    on obtient alors
    23/03/15
    28/03/15
    02/04/15
    07/04/15
    12/04/15
    17/04/15
    22/04/15
    27/04/15
    02/05/15
    07/05/15
    12/05/15
    17/05/15
    22/05/15
    27/05/15
    01/06/15
    06/06/15
    11/06/15
    16/06/15
    21/06/15
    26/06/15
    le résultat ne ressemble pas au résultat souhaité , veut t-on alors obtenir les jours "divisibles" par 5 ?
    Ce qui me fait douter :
    la date de départ est la date du jour soit le 23/03/2015.
    la date qui suit la date de départ sera le 25/03/2015
    Ensuite le 31/03/2015.
    dans le premier calcul il y a seulement 2 jours d'écart
    dans le second 6

  7. #7
    Membre Expert

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

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    En fonction de la version de Delphi que tu as, les génériques, IncDay, MonthOf et et StartOfTheMonth risquent de ne pas exister.
    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
     
    procedure getDates(pDate_Depart: TDateTime; pDate_Count: Integer; pList: TList<TDateTime>);
    var
      lDate, lDate_Precedente: TDateTime;
      i: Integer;
    begin
      lDate_Precedente := StartOfTheMonth(pDate_Depart);
      lDate:=lDate_Precedente;
      for i := 0 to pDate_Count - 1 do begin
        if CompareDate(lDate, StartOfTheMonth(lDate))=EqualsValue then
          lDate := IncDay(lDate_Precedente, 4)
        else
          lDate := IncDay(lDate_Precedente, 5);
        if MonthOf(lDate) <> MonthOf(lDate_Precedente) then begin
          lDate := StartOfTheMonth(lDate);
        end;
        if lDate >= pDate_Depart then
          pList.Add(lDate);
        lDate_Precedente := lDate;
      end;
    end;
    Edit: corrigé

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Re,
    moi j'ai fait ainsi avec D7
    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
    procedure TForm1.Button5daysamonthClick(Sender: TObject);
    var aa,mm,jj : Word;
        mm1 : Word; // mois initial
        wmm : Word; // variables de travail
        D : TDateTime;
    begin
      D := EncodeDate(15,03,23);
      DecodeDate(D,aa,mm,jj);
      mm1:=mm;
      wmm:=mm;
      repeat
        Memo1.Lines.Add(FormatDateTime('dd/mm/yy',D));
        if mm<>wmm
         then D:=EndOfAMonth(aa,wmm);
        D:=IncDay(D,5);
        DecodeDate(D,aa,mm,jj);
        if (jj mod 5)>0 then
              begin
                jj:=jj - (jj mod 5);
                if jj<1 then jj:=5;
                D:=EncodeDate(aa,mm,jj);
              end;
         wmm:=mm;      
      until (mm>mm1+3);
     
    end;
    résultats
    23/03/15
    25/03/15
    30/03/15
    05/04/15
    10/04/15
    15/04/15
    20/04/15
    25/04/15
    30/04/15
    05/05/15
    10/05/15
    15/05/15
    20/05/15
    25/05/15
    30/05/15
    05/06/15
    10/06/15
    15/06/15
    20/06/15
    25/06/15
    30/06/15
    [Edit]
    il faut ensuite peu de chose pour obtenir la fin du mois (au prochain [edit])

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    résultats
    30/03/15
    05/04/15
    6 jours entre ces deux dates...

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    re, j'ai eu quelques difficultés avec Février mais voici un code D7 qui semblerai correspondre à la demande
    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
     
    procedure TForm1.Button5daysamonthClick(Sender: TObject);
    var aa,mm,jj : Word;
        mm1 : Word; // mois initial
        wmm : Word; // variables de travail
        D : TDateTime;
    begin
      D := EncodeDate(15,01,2);  // jour de départ
      DecodeDate(D,aa,mm,jj);
      mm1:=mm;                       // memorisation pour la boucle  
      wmm:=mm;
      repeat
        Memo1.Lines.Add(FormatDateTime('dd/mm/yy',D));
        D:=IncDay(D,5);
        DecodeDate(D,aa,mm,jj);
         if (jj mod 5)>0 then
              begin
                jj:=jj - (jj mod 5);
                if jj<1 then jj:=5;
                D:=EncodeDate(aa,mm,jj);
              end;
         // détecter la fin du mois et gère le cas particulier de Février (moins de 5 jours entre le 25 et la fin du mois) 
         if (jj=30) OR ((wmm=2) and (mm<>wmm)) then
         begin
          D:=IncDay(EndOfTheMonth(EncodeDate(aa,wmm,1)),-1); // *****
         end;
        wmm:=mm;
       until (mm>mm1+3);
     
    end;
    ****** chose étrange EndOfTheMonth(EncodeDate(aa,wmm,1)) donne par exemple 1/03/15 au lieu de 28/02/15 d'où l'utilisation du incday -1
    problème d'arrondi ? en tout cas je ne pige pas pourquoi j'ai du faire ça ! erreur d'arrondi ?

    résultat
    02/01/15
    05/01/15
    10/01/15
    15/01/15
    20/01/15
    25/01/15
    31/01/15
    05/02/15
    10/02/15
    15/02/15
    20/02/15
    25/02/15
    28/02/15
    05/03/15
    10/03/15
    15/03/15
    20/03/15
    25/03/15
    31/03/15
    05/04/15
    10/04/15
    15/04/15
    20/04/15
    25/04/15
    30/04/15
    [Edit] @Jipété sur ce que j'ai compris , outre "l'arrondi de la date de départ" , les dates sont de 5 en 5 sauf que en fin de mois on obtient la fin du mois et non le 30 ,
    la date de départ est la date du jour soit le 23/03/2015.
    la date qui suit la date de départ sera le 25/03/2015
    Ensuite le 31/03/2015.
    cas particulier donc au mois de février en prime . Donc non, c'est un voulu de ma part

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

Discussions similaires

  1. Incrémenter des dates
    Par roidurif dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/05/2013, 20h37
  2. Réponses: 2
    Dernier message: 06/10/2010, 10h23
  3. JSP incrémentation des jours d'une date
    Par taroudant dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 07/08/2006, 10h20
  4. Réponses: 3
    Dernier message: 19/03/2003, 15h19
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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