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

VB 6 et antérieur Discussion :

DateDiff et années bissextiles


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 18
    Points
    18
    Par défaut DateDiff et années bissextiles
    Bonsoir je me demande si la fonction DateDiff gère les années bissextiles ou bien est-ce que je suis obligé de passer par IsLeapYear ? je cherche mais c'est pas clair du tout.
    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Bien sûr;
    Voici un petit exemple qui illustre ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Form_Load()
       Dim Dt1 As Date, Dt2 As Date  ' Déclare les variables.
        Dim Msg$
        Me.AutoRedraw = True
        Dt1 = "01/01/2008"
        Dt2 = "01/01/2009"
        Msg = "Jours entre " & Dt1 & " et " & Dt2 & " : " & DateDiff("d", Dt1, Dt2)
     
        Dt1 = "01/01/2007" 'InputBox("Entrez une date")
        Dt2 = "01/01/2008" 'InputBox("Entrez une autre date")
        Msg = Msg & vbCrLf & "Jours entre " & Dt1 & " et " & Dt2 & " : " & DateDiff("d", Dt1, Dt2)
        MsgBox Msg
    End Sub
    Rq : IsLeapYear n'est pas géré par VB6.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Merci donc tu confirmes bien que dateDiff gère les années bissextiles je posais la question car sur aucun tutoriel c'était écrit noir sur blanc alors c'est pour ça j'étais pas sur. Enfin j'ai peut être pas trouvé les bons

    En fait j'ai écrit un code mais mon problème c'est qu'il ne gère pas les années bissextiles et les mois à 30 et 31 sinon il fonctionne

    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
     
    Public Function CalculAncienneté(ByVal d As Date)
     
    Dim NbrA As String, NbrM As String, NbrJ As String
    Dim NbrH As Single, NbrMin As Single, NbrS As Single
    Dim difference As Single
    Dim TotalJours As Integer
     
    TotalJours = Date - d
    NbrA = TotalJours \ 365
    TotalJours = TotalJours Mod 365
    NbrM = TotalJours \ 30
    NbrJ = TotalJours Mod 30
    If NbrJ >= 0 And NbrM >= 0 And NbrA >= 0 And TotalJours <> 0 Then
    CalculAncienneté = NbrA & " ans, " & NbrM & " mois et " & NbrJ & " jours."
    ElseIf TotalJours = 0 Or NbrJ = -1 Then
    NbrJ = d
     'renvoi la différence de temps en secondes
    difference = DateDiff("s", Now, NbrJ)
    NbrH = CInt((((difference Mod 86400) \ 3600)))
    NbrMin = CInt(((difference Mod 86400) Mod 3600) \ 60)
    NbrS = CInt((((difference Mod 86400) Mod 3600) Mod 60))
    CalculAncienneté = Abs(NbrH) & ":" & Abs(NbrMin) & " et " & Abs(NbrS) & " secondes."
     
    End If
    End Function
    Si vous avez une astuce ?

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    salut

    Nous ne pourrons te répondre réellement valablement que lorsque tu nous auras défini avec précision ce que doit être ta valable CalculAncienneté.
    Deux approches sont en effet possibles :
    1) approche "durée temporelle" :
    et il ne peut alors s'agir que d'une durée exprimée en jours, heures, minutes et secondes (toute notion d'années et mois est calendaire et n'a alors plus rien nà voir)
    2) approche "calendaire" (comme pour un âge)
    et ce n'est que dans ce cas qu'intervient (du fait notamment des années bissextiles) la notion d'année ou/et celle de mois.
    Précise-npous ce point et tu auras ta réponse précise.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Oui c'est le cas numéro 2 c'est à dire calendaire comme pour l'âge.

    Pour être plus précise je récupère en paramètre une date et cette date je la compare à la date système. Mon résultat affiche le nombre d'années, de mois et de jours, là c'est un problème car ne tient compte seulement de 30 jours .
    Après si la comparaison des deux dates est inférieur à 1 jour alors je calcul le nombre d'heures, minutes, et secondes et là pas de problème.

    Sinon je pense avoir trouvé un truc pas mal pour les années :

    ((joursysteme - jourNaissance + ( moisSysteme - moisNaissance ) * 365.25/12 +(anneeSysteme - anneeNaissance) *365.25)/365.25)

    Car la durée moyenne d'une année, années bissextiles comprises est de 365.25 jours.

    Par contre ça résoud pas le probleme des mois 30 et 31.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    C'est encore moi j'ai trouvé autre chose aui a l'air bien

    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
     
     Function ConvertisseurAnnMoisJour(ByVal maDureeJour As Integer) As Integer
            Dim nbAns As Integer
            Dim nbMois As Integer
            Dim nbJours As Integer
     
            '\, opérateur : Effectue la division de deux nombres et retourne le résultat sous forme d'entier.
            'Mod, opérateur (Visual Basic) : Effectue la division de deux nombres et retourne seulement le reste.
            nbAns = maDureeJour \ 365.25
            nbMois = (maDureeJour Mod 365.25) \ 30.4375
            nbJours = (maDureeJour Mod 365.25) Mod 30.4375
     
            'Pour tester, à adapter bien sûr.
            Return MsgBox(nbAns & " années " & nbMois & " mois " & nbJours & " jours ")
        End Function
    Exemple: 5376 me donne 14 ans 8 mois et 19 jours, l'âge de ta personne.
    J'attends voir ce que vous en pensez et pendant ce temps je le teste.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    salut,
    et ?
    Il suffira, pour que ta division par 365.25 aboutisse à un résultat non suffisamment précis, qu'aucune année bissextile ne soit présente entre les deux dates considérées !

    Inspire-toi par exemple de ceci :
    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
    Private Sub CommandButton1_Click()
      MsgBox Age("02/01/2007", "28/03/2009")
    End Sub
    Public Function Age(D1 As String, D2 As String) As String
      Dim nba As Integer, nbm As Integer, nbj As Integer
      Age = "une date est manquante"
      If D1 = "" Or D2 = "" Then Exit Function
      Age = "La 2ème date doit nécessairement être plus grande que la 1ère !"
      If DateValue(D1) > DateValue(D2) Or Not IsDate(D2) Then Exit Function
      Dim K As Long
      K = IIf(Day(D2) < Day(D1), 1, 0)
      nba = Year(D2) - Year(D1) - Switch(Month(D2) < Month(D1), 1, Month(D2) = Month(D1), _
      K, True, 0)
      nbm = (Month(D2) - Month(D1) - K + 12) Mod 12
      nbj = Day(D2) - Day(D1) + K * Day(DateSerial(Year(D2), Month(D2), 1) - 1)
      Age = Trim(IIf(nba > 0, nba & " an" & IIf(nba > 1, "s", "") & " ", "") & _
      IIf(nbm > 0, nbm & " mois ", "") & IIf((nbj > 0) Or (nba + nbm = 0), nbj & " jour" & _
      IIf(nbj > 1, "s", ""), ""))
    End Function

  8. #8
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Bonjour, désolé pour le temps de réponse mais entre les fonctions que je ne comprends pas et la perte de mes identifiants pas évident :/
    Sinon voici le code adapté et qui fonctionne parfaitement :

    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
     
    Public Function CalculAncienneté(ByVal d As Date) As String
     
    Dim NbrA As String, NbrM As String, NbrJ As String
    Dim NbrH As Single, NbrMin As Single, NbrS As Single
    Dim difference As Single
    Dim TotalJours As Integer
     
    TotalJours = Date - d
    Dim k As Long
    k = IIf(Day(Now) < Day(d), 1, 0)
    NbrA = Year(Now) - Year(d) - Switch(Month(Now) < Month(d), 1, Month(Now) = Month(Date), k, True, 0)
    NbrM = (Month(Now) - Month(d) - k + 12) Mod 12
    NbrJ = Day(Now) - Day(d) + k * Day(DateSerial(Year(Now), Month(Now), 1) - 1)
    If TotalJours <> 0 Then
    CalculAncienneté = Trim(IIf(NbrA > 0, NbrA & " an" & IIf(NbrA > 1, "s", "") & " ", "") & IIf(NbrM > 0, NbrM & " mois ", "") & _
    IIf((NbrJ > 0) Or (NbrA + NbrM = 0), NbrJ & " jour" & _
    IIf(NbrJ > 1, "s", ""), ""))
    ElseIf TotalJours = 0 Then
    NbrJ = d
     'renvoi la différence de temps en secondes
    difference = DateDiff("s", Now, NbrJ)
    NbrH = CInt((((difference Mod 86400) \ 3600)))
    NbrMin = CInt(((difference Mod 86400) Mod 3600) \ 60)
    NbrS = CInt((((difference Mod 86400) Mod 3600) Mod 60))
    CalculAncienneté = Abs(NbrH) & ":" & Abs(NbrMin) & " et " & Abs(NbrS) & " secondes."
     
    End If
    End Function
    Je sais que k est affecté par 0 ou 1 mais pourquoi ?
    DateSerial c'est la date obtenue à partir du numéro d'année, de mois et de jour.
    Switch : extrait une valeur d'une liste (là encore je ne comprends pas)

    Donc voilà code très optimisé et de plus j'ai du mal avec le raisonnement des calculs, du coup je ne comprends toujours pas

    Si par hasard babaothe tu peux le rédiger en français ça m'aiderai étant débutante j'ai très envie de comprendre. Car là je suis beaucoup perdue. J'ai l'habitude d'énormement développer le code

    En fait c'est surtout pour l'affectation Nbra, NbrM et NbrJ sinon le reste c'est bon.

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    salut, Qosmio

    contrairement à ce que tu penses, il s'agit mille fois moins de syntaxe que de compréhension de la pensée. Elle est ici surtout exprimée dans la détermination de la variable K.
    Cela commence ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    k = IIf(Day(Now) < Day(d), 1, 0)
    Et signifie ceci n:
    Si le n° de jour actuel est inférieur à celui de la date d, alors k vaut 1, si non : k vaut 0.
    Mais c'est précisément là que commence le mécanisme de la pensée et c'est aussi précisément là qu'il ne s'agit plus de connaissance de la syntaxe mais de l'organisation de cette pensée. L'abord serait le même quel que pût être le langage de développement utilisé : celui du raisonnement (n'ayant rien à voir avec VB ou tout autre langage de développement, mais tout avec ... soi-même)
    La fonction switch est quant à elle suffisamment exposée par MSDN et ne me parait donc pas devoir faire l'objet d'autres explications !
    Pour l'essentiel : l'exposé du mécanisme de la pensée :
    - j'éprouve toujours les plus grandes difficultés à partager les miens
    - l'effort nécessaire pour l'exposer serait mille fois supérieur (un roman) à celui de la pensée qui vient (clairement et en "flash") à mon esprit. Je n'en suis pas le chef d'orchestre, mais plustôt le serviteur.
    Une autre fois : dans cette affaire, il s'agit très peu de développement et énormément de raisonnement. Je ne me sens pas le courage de me lancer dans un long exposé de ce qui s'impose à moi. Désolé. Amitiés.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Arf dommage, il va falloir que je le retourne dans tous les sens mais promis je finirai pas le comprendre !

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Je te propose d'exercer autrement la pensée dans le but d'établir un autre mécanisme logique. IUl te faudra en faire ensuite le tien .
    Comment s'établit donc l'âge ? Ainsi
    on détermine ;
    - la différence DA en années (N° de l'année actuelle - N° de l'année de naissance)
    - la différence DM en mois (N° du mois actuel - N° du mois de naissance)
    - la différence DJ en jours (N° du jour actuel - N° du jour de naissance)
    Soient AGEA, AGEM et AGEJ les 3 (Années, mois et jours) composantes de l'âge
    on commence par DJ :
    --- si positif : AGEJ = DJ et on ne touche ni à DM, ni à DA
    --- si négatif : AGEJ = N° du jour de naissance, DM = DM-1 et on nne touche pas à AGEA
    on passe maintenant à DM (dont la valeur peut, comme vu, avoir déja changé) et on poursuit le raisonnement sur la même lancée et le même mode de pensée ...
    --- si positif .....
    etc...
    Je te laisse ce plaisir. Mets-toi à la chose.
    Amitiés.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Merci babaothe Je vais y réfléchir serieusement.

    @ bientôt

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

Discussions similaires

  1. Problème DATEDIFF en année
    Par Mengallor dans le forum Développement
    Réponses: 7
    Dernier message: 06/11/2009, 09h55
  2. [Dates] Liste déroulante date et années bissextiles
    Par Jiraiya42 dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2007, 00h04
  3. test année bissextile
    Par franfr57 dans le forum ASP
    Réponses: 1
    Dernier message: 07/05/2007, 13h28
  4. Année bissextile [9i]
    Par kalyparker dans le forum Oracle
    Réponses: 8
    Dernier message: 09/02/2007, 22h48
  5. [VBA-E] Graphique superposé avec année bissextile
    Par popo68 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/01/2007, 14h22

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