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.
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.
Bien sûr;
Voici un petit exemple qui illustre ça :
Rq : IsLeapYear n'est pas géré par VB6.
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
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
Si vous avez une astuce ?
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
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.
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.
C'est encore moi j'ai trouvé autre chose aui a l'air bien
Exemple: 5376 me donne 14 ans 8 mois et 19 jours, l'âge de ta personne.
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
J'attends voir ce que vous en pensez et pendant ce temps je le teste.
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
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 :
Je sais que k est affecté par 0 ou 1 mais pourquoi ?
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
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.
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 :
Et signifie ceci n:
Code : Sélectionner tout - Visualiser dans une fenêtre à part k = IIf(Day(Now) < Day(d), 1, 0)
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.
Arf dommage, il va falloir que je le retourne dans tous les sens mais promis je finirai pas le comprendre !
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.
Merci babaothe Je vais y réfléchir serieusement.
@ bientôt
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager