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 de semaines dans un mois ? [FAQ]


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut nombre de semaines dans un mois ?
    Bonjour, comment calculer le nombre de semaines entre deux dates ?
    Un précédent collègue avait codé la chose suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    n := trunc(DateFin) - trunc(DateDebut);
    NbSem := n div 7;
    if n mod 7 > 0 then inc(NbSem);
    Mais le résultat est faux.
    Par exemple cela me donne 5 semaines pour le mois de juillet alors que le mois de juillet s'étale sur 6 semaines du dimanche 1er juillet au mardi 31 juillet.

    Merci de votre aide, je suis sûre que c simple mais j'ai le cerveau trop ramolli pour réfléchir (semaine très difficile)

    Isa
    Isachat

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    regarde du coté de WeeksBetween() avec uses DateUtils;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Merci beaucoup, mais cela ne convient pas.
    En effet entre le 01/07/2007 et le 31/07/2007 le fonction WeeksBetween() me renvoie 4 (c.a.d. le nb de semaines complètes entre ces deux dates)
    Le nb que je souhaite obtenir est 6 (nb de semaines complètes ou incomplètes entre ces deux dates)
    Bon je vais prendre un café et faire fonctionner les neurones qui me restent

    Isa
    Isachat

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Points : 30
    Points
    30
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    showmessage(
    floattostr(
    ceil(weekspan(strtodate('01/07/2007'),endoftheWeek(strtodate('01/07/2007'))))
    +
    ceil(weekspan(StartoftheWeek(strtodate('31/07/2007')),(strtodate('31/07/2007'))))
    +
    weeksBetween(strtodate('01/07/2007'),strtodate('31/07/2007'))
    )
    );

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    aide Delphi7 en français

    WeekOfTheMonth,fonction
    Renvoie la semaine du mois représentépar une valeur TDateTime.

    Unité

    DateUtils

    Catégorie

    routines date/heure

    Syntaxe Delphi :

    function WeekOfTheMonth(constAValue:TDateTime):Word;overload;
    function WeekOfTheMonth(constAValue:TDateTime;varAYear,AMonth:Word):Word;overload;

    Syntaxe C++:

    extern PACKAGE Word__ fastcallWeekOfTheMonth(constSystem::TDateTimeAValue);
    extern PACKAGE Word__ fastcallWeekOfTheMonth(constSystem::TDateTimeAValue,Word &AYear,Word &AMonth);

    Description

    Appelez WeekOfTheMonth pour obtenir la semaine du mois représentépar une valeur TDateTime spécifiée.WeekOfTheMonth renvoie une valeur comprise entre 1 et 6.

    AYear et AMonth renvoient l'année et le mois dans lesquels WeekOfTheMonth tombe.Ces valeurs peuvent différer de l'année et du mois de AValue.En effet,la première semaine d'un mois est la première qui contient au moins quatre jours dans ce mois.Par conséquent,si le premier jour du mois est vendredi,samedi ou dimanche,le premier,les deux premiers ou les trois premiers jours du mois appartiennent àla dernière semaine du mois antérieur.De même,si le dernier jour du mois est lundi,mardi ou mercredi,le dernier,les deux derniers ou les trois derniers jours du mois appartiennent à la première semaine du mois suivant.

    Conseil : Pour compter des semaines basées sur le jour de la semaine de la valeur date et heure,utilisez plutôt la fonction NthDayOfWeek.Par exemple,si AValue représente un samedi qui est le premier jour du mois,WeekOfTheMonth renvoie 5 (ou bien 4),en indiquant la dernière semaine du mois précédent,tandis que NthDayOfWeek renvoie 1 lorsque AValue est le premier samedi du mois .

    Remarque : WeekOfTheMonth définit la semaine d'après la norme ISO 8601 :la semaine commence le lundi et s'achève le dimanche.

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Tu peux trouver ici :

    http://www.developpez.net/forums/sho...ight=deux+Date
    la fonction d'e-ric 18/08/2006, 14h22 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function DaysBetween(const ANow, AThen: TDateTime): Integer; 
    begin    Result := Abs(Trunc(AThen) - Trunc(ANow)); 
    end;
    qui donne le nombre de jours moins 1 entre deux dates
    ... suffit de remplacer ANow, AThen par ADate1, ADate2
    ... puis connaissant le nombre de jours tu peux calculer le nb de semaines complètes ou incomplètes.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Re-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbSem :=  ceil(WeekSpan(trunc(StartoftheWeek(DateDebut)),trunc(endoftheWeek(DateFin))));
    semble donner un résultat correct.

    Merci
    Isachat

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-Salut,

    Isachat666 a écrit :
    .. , mais cela ne convient pas.
    En effet entre le 01/07/2007 et le 31/07/2007 le fonction WeeksBetween() me renvoie 4 (c.a.d. le nb de semaines complètes entre ces deux dates)
    Le nb que je souhaite obtenir est 6 (nb de semaines complètes ou incomplètes entre ces deux dates)
    ... comment peux-tu souhaiter obtenir le nb 6 semaines alors qu'il n'y en a que 4 et 2 jours entre les dates indiquées ??

    Test effectué avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function DaysBetween(const ADate1, ADate2: TDateTime): Integer;
    begin    Result := Abs(Trunc(ADate2) - Trunc(ADate1)) +1 ;
    end;
    et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
              ...
              nbJours:=DaysBetween(strtodate('01/07/2007'),strtodate('31/07/2007 '));
              nbSem:=nbJours/7;
              showMessage(floatToStr(nbSem));
    ... résultat : affiche 4,428 semaines.
    A+

    EDIT : ai été pris de vitesse.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Normalement la norme Iso ????? indique qu'une semaine appartient au mois qui contient au moins 4 jour de la semaine.

    Si 1 mois commence le Jeudi, La 1° semaine du mois commence le 1° du mois.
    Si le mois commence le vendredi, La 1° semaine du mois commence le Luni 4 du mois.

    Par conséquence, 1 mois peut avoir jusqu 'a 6 semaines.

    Le problème est de calculer le nombre de semaine dans un mois, de fçon a ce que la somme de toutes les nombres de semaine de tout les mois d'une années soit le nombre de semaine de l'année.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Bonjour,
    Peut-être que le code suivant est plus correct que celui de mon précédent post:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    n := trunc(endoftheWeek(DateFin)) - trunc(StartoftheWeek(DateDebut));
    NbSem := n div 7;
    if n mod 7 > 0 then inc(NbSem);
    ... comment peux-tu souhaiter obtenir le nb 6 semaines alors qu'il n'y en a que 4 et 2 jours entre les dates indiquées ??
    il y a 4 semaines complètes plus deux semaines incomplètes (le 1er du mois est le dimanche de la première semaine et le 30 et 31 sont le lundi et mardi de la dernière semaine) donc voilà pourquoi je veux obtenir le nb 6.

    c'est simple c'est pour afficher un état et les données s'affichent par semaine (1 colonne par semaine) donc si je sélectionne juillet 2007 il faut que mon état s'affiche sur 6 colonnes:
    sem 1 sem 2 sem 3 sem 4 sem 5 sem 6
    25/06/07 02/07/07 09/07/07 16/07/07 23/07/07 30/07/07
    01/07/07 08/07/07 15/07/07 22/07/07 29/07/07 05/08/07

    c'est pe un peu plus clair comme cela :-)
    Isachat

  11. #11
    Membre expérimenté Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Points : 1 381
    Points
    1 381
    Par défaut
    chaque semaine dans une année à un numéro, donc il suffit de regarder à quelle semaine appartient le 1er juillet, et à quelle semaine appartient le 31 juillet, et de faire la différence + 1 !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Citation Envoyé par Tober
    chaque semaine dans une année à un numéro, donc il suffit de regarder à quelle semaine appartient le 1er juillet, et à quelle semaine appartient le 31 juillet, et de faire la différence + 1 !
    juste pour chercher la petite bête

    cette méthode ne marchera pas pour le mois de décembre 2007 car le numéro de semaine de la dernière semaine est 1 (et décembre 2007 est un mois qui s'affiche sur 6 semaines la dernière semaine étant à cheval sur decembre 2007 janvier 2008)
    Isachat

  13. #13
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    SAlut
    Tiens en faisant comme ca ca marche a chaque fois
    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
     
    function TForm1.NbrWeekOfMonth(MoisAnnee : TDateTime): Integer;
    Var JDebut, JFin, NbrS: Integer;
        DateStart, DateEnd : TDateTime;
    begin
    DateStart := StartOfTheMonth(MoisAnnee);
    DateEnd := EndOfTheMonth(MoisAnnee);
    JDebut := DayOfTheWeek(DateStart);   //Lun=1 Dim=7
    JFin := DayOfTheWeek(DateEnd);
    NbrS := 0;
    repeat //On cherche le nombre de block de 7 jours
          Inc(Nbrs);
    Until IncDay(DateStart,7*NbrS) > DateEnd; //peut etre une fonct° plus propre que ca existe
    //On regarde si le jour de la dernier semaine se trouve avant le jour de la date de fin de semaine
    //Si c'est le cas il y a encore une semaine incomplete a rajouter
    If Jdebut > JFin Then Inc(NbrS);
    result := NbrS;
    end;
    Edit:Il serait peut etre possible de chager le repeat par un function integrer qui donnerai le nombre de Lun, Mar,Mer ... dans le mois, mais je n'est rien vu de tel. /Edit

    Ca fait un fonction en plus mais bon elleest pas tres grosse
    a++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

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

Discussions similaires

  1. [Dates] Nombre de semaines dans le mois
    Par Prosis dans le forum Langage
    Réponses: 7
    Dernier message: 05/03/2016, 11h10
  2. Réponses: 1
    Dernier message: 28/06/2009, 08h56
  3. [Dates] Calculer le nombre de jours dans le mois suivant...
    Par Life Hunter dans le forum Langage
    Réponses: 5
    Dernier message: 14/03/2006, 00h01
  4. Nombres de lundis dans un mois.
    Par Celelibi dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 24/09/2005, 16h50
  5. [CR]nombre de jours dans un mois donné
    Par liberio dans le forum Formules
    Réponses: 2
    Dernier message: 20/04/2004, 16h54

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