cs_fonio
Messages postés56Date d'inscriptionlundi 26 novembre 2007StatutMembreDernière intervention15 février 20131 3 janv. 2013 à 14:59
Hello. Old topic, mais solution qui fonctionne = Commentaire de Renfield le 09/09/2009 10:58:27
avec la petite modif suivante :
"vdInput + 7" modifié en "vdInput.AddDays(7)"
soit :
Public Function GetISOWeek(ByVal vdInput As Date) As Long
GetISOWeek = DatePart("ww", vdInput, vbMonday, vbFirstFourDays) If GetISOWeek >52 And DatePart("ww", vdInput.AddDays(7), vbMonday, vbFirstFourDays) 2 Then
GetISOWeek = 1
End If
End Function
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 28 sept. 2009 à 09:10
Numérotation ISO des semaines
http://fr.wikipedia.org/wiki/Num%C3%A9rotation_ISO_des_semaines Il faut parfois faire un traitement en plus selon si l'on souhaite ou pas avoir une semaine n°53 et pas de semaine n°1 (cela peut arriver, par exemple au début de l'année 2009 avec la fonction DotNet que j'ai indiquée)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 19:55
idem que la solution de Jack... strictement.
fauda m'expliquer la necessité de faire:
DateSerial(Year(Date), Month(Date), Day(Date))
pourquoi ne pas laisser Date ??
cgui33
Messages postés1174Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention 2 avril 2009 9 sept. 2009 à 19:13
Salut à tous
Moi j'utilise ça , mais je n'ai jamais comparé avec des dates anciennes ...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 15:13
nop, c'est ce qu'a proposé Jack au début:
? DatePart("ww", now, vbMonday, vbFirstFourDays)
(vbMonday vaut 2 :p)
du coup, ca colle pas.
Sechaud
Messages postés288Date d'inscriptionjeudi 28 octobre 2004StatutMembreDernière intervention 3 janvier 2017 9 sept. 2009 à 15:08
J'ai trouvé ce code qui semble donner les mêmes résultats que Renfield:
Semaine = DatePart("ww", LaDate, 2, vbFirstFourDays)
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 9 sept. 2009 à 13:03
En DotNet, la méthode qui correspond au n° de semaine de outlook en français (réglage par défaut) de la date dDate est :
iNumSemDate = Globalization.CultureInfo.CurrentCulture.Calendar.
GetWeekOfYear(dDate, Globalization.CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday)
Sinon il y a 3 méthodes possible : FirstFourDayWeek, FirstFullWeek ou FirstDay
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 11:02
pardon pour le flood ^^
par exemple, le lundi 30 décembre 1907
DatePart nous indique 53
si on ajoute 1 jour => semaine 1
si on ajoute 2 jour => semaine 1
si on ajoute 3 jour => semaine 1
si on ajoute 4 jour => semaine 1
si on ajoute 5 jour => semaine 1
si on ajoute 6 jour => semaine 1
si on ajoute 7 jour => semaine 2
une semaine faisant bien 7 jours, notre lundi aurais du faire partie de la semaine 1...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 10:58
Je propose donc une version nettoyée de toute considération d'année de mon Snippet :
Public Function GetISOWeek(ByVal vdInput As Date) As Long
GetISOWeek = DatePart("ww", vdInput, vbMonday, vbFirstFourDays)
If GetISOWeek >52 And DatePart("ww", vdInput + 7, vbMonday, vbFirstFourDays) 2 Then
GetISOWeek = 1
End If
End Function
en gros, une simple correction de la fonction VB:
si la semaine est la 52 (ou plus)
si en ajoutant 7 jours on passe à la semaine 2 ; la semaine considérée devrait être la semaine 1
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 9 sept. 2009 à 10:55
Pour ici, au Québec, la semaine 1/2009 commence le dimanche 4 janvier.
La semaine précédente était la 53 (28 déc 2008 au 3 janv 2009)
Pas simples ces histoires de semaines...
Sechaud
Messages postés288Date d'inscriptionjeudi 28 octobre 2004StatutMembreDernière intervention 3 janvier 2017 9 sept. 2009 à 10:51
Je vais étudier ça de plus près.
En tous cas, merci beaucoup pour les divers tuyaux des uns et des autres.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 10:37
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 10:36
moins bon que le coup précédent.
date moi jack
01/01/1999 53 52
02/01/1999 53 52
03/01/1999 53 1
10/01/1999 1 2
17/01/1999 2 3
24/01/1999 3 4
31/01/1999 4 5
07/02/1999 5 6
après, j'ai validé mes résultats avec les exemples dispos sur le wiki et qui me semblent corrects...
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 9 sept. 2009 à 10:29
En effet, il y a un binz avec la désignation du premier jour de la semaine.
Si on fait DatePart("w", Now, vbMonday, vbFirstFourDays)
on découvre qu'aujourd'hui, on serait un mardi, alors qu'on est mercredi.
Il faut donc passer sur vbSunday comme premier jour de la semaine pour que le jour de la semaine soit correcte.
Le calcul du numéro de la semaine doit donc utiliser vbSunday pour être correct
DatePart("ww", "31/12/1951", vbSunday, vbFirstFourDays)
Sechaud
Messages postés288Date d'inscriptionjeudi 28 octobre 2004StatutMembreDernière intervention 3 janvier 2017 9 sept. 2009 à 10:28
Effectivement je ne puis que constater les erreurs.
Après recherche dans mes archives, je propose cette méthode qui semble plus juste:
Private Sub Command1_Click()
Dim LaDate As Variant
Dim Semaine As Byte
LaDate = Text1.Text 'Entrer la date sous la forme 09/09/2009 par ex.
Semaine = CByte(DatePart("ww", LaDate, vbMonday, vbFirstFourDays)) Mod 53
If Semaine = 0 Then
Semaine = 1
End If
Text2.Text = Semaine
End Sub
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 10:18
"Renfield"
non, ca ne me gène pas, c'est le même numéro de semaine, mais pas de la même année ^^
cs_dox
Messages postés8Date d'inscriptionjeudi 17 août 2000StatutMembreDernière intervention21 janvier 2008 9 sept. 2009 à 10:13
Reinfield: Celà ne te gène pas que le 01/01/1997 et le 31/12/1997 donne le même numéro de semaine?????
Je pense que la bonne méthode est la fonction datepart détaillée par jack, et pour une fois on a une fonction VB6 qui fonctionne correctement.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 09:57
Je reprend mon Snippet et j'en extraie le numéro de semaine :
Public Function GetISOWeekNumber(ByVal vdInput As Date) As Long
Dim nWeek As Long
Dim nYear As Long
nYear = Year(vdInput)
nWeek = DatePart("ww", vdInput, vbMonday, vbFirstFourDays)
If nWeek >= 52 Then
If DatePart("ww", vdInput + 7, vbMonday, vbFirstFourDays) = 2 Then
nWeek = 1
nYear = nYear + 1
ElseIf Month(vdInput) = 1 Then
nYear = nYear - 1
End If
ElseIf nWeek 1 And Month(vdInput) 12 Then
nYear = nYear + 1
End If
GetISOWeekNumber = nWeek
End Function
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 9 sept. 2009 à 09:51
Sechaud : Attention, sans paramètre, le calcul se fait "à l'américaine" avec :
- 1er jour de la semaine = Dimanche
- 1ère semaine : vbUseSystem
et tu auras un problème dès le 1er janvier 2010 !
D'ailleurs, dans le calendrier de Outlook, il faut aller modifier les paramètres afin d'avoir un n° de semaine compatible à l'europe (par défaut, semaine 1 = semaine du 1er janvier)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 9 sept. 2009 à 09:46
Non, "la première semaine de l'année ISO est celle du premier jeudi de janvier", c'est à dire la première semaine d'au moins 4 jours = vbFirstFourDays
http://fr.wikipedia.org/wiki/Num%C3%A9rotation_ISO_des_semaines Vérifie avec de vieux agendas, ça fonctionne.
Exemple : Le 29 déc 2008 faisait bien partie de la semaine 1 de 2009, et en aucun cas la 53 (au pire la 52)
Exemple : 2009 aura 53 semaines, la semaine 1 commencera le 4 janvier 2010.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 sept. 2009 à 09:35
3 janv. 2013 à 14:59
avec la petite modif suivante :
"vdInput + 7" modifié en "vdInput.AddDays(7)"
soit :
Public Function GetISOWeek(ByVal vdInput As Date) As Long
GetISOWeek = DatePart("ww", vdInput, vbMonday, vbFirstFourDays) If GetISOWeek >52 And DatePart("ww", vdInput.AddDays(7), vbMonday, vbFirstFourDays) 2 Then
GetISOWeek = 1
End If
End Function
28 sept. 2009 à 09:10
http://fr.wikipedia.org/wiki/Num%C3%A9rotation_ISO_des_semaines
Il faut parfois faire un traitement en plus selon si l'on souhaite ou pas avoir une semaine n°53 et pas de semaine n°1 (cela peut arriver, par exemple au début de l'année 2009 avec la fonction DotNet que j'ai indiquée)
9 sept. 2009 à 19:55
fauda m'expliquer la necessité de faire:
DateSerial(Year(Date), Month(Date), Day(Date))
pourquoi ne pas laisser Date ??
9 sept. 2009 à 19:13
Moi j'utilise ça , mais je n'ai jamais comparé avec des dates anciennes ...
NumSemaine = DatePart("ww", DateSerial(Year(Date), Month(Date), Day(Date)), vbMonday, vbFirstFourDays)
A voir ...
9 sept. 2009 à 15:13
? DatePart("ww", now, vbMonday, vbFirstFourDays)
(vbMonday vaut 2 :p)
du coup, ca colle pas.
9 sept. 2009 à 15:08
Semaine = DatePart("ww", LaDate, 2, vbFirstFourDays)
9 sept. 2009 à 13:03
iNumSemDate = Globalization.CultureInfo.CurrentCulture.Calendar.
GetWeekOfYear(dDate, Globalization.CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday)
Sinon il y a 3 méthodes possible : FirstFourDayWeek, FirstFullWeek ou FirstDay
9 sept. 2009 à 11:02
par exemple, le lundi 30 décembre 1907
DatePart nous indique 53
si on ajoute 1 jour => semaine 1
si on ajoute 2 jour => semaine 1
si on ajoute 3 jour => semaine 1
si on ajoute 4 jour => semaine 1
si on ajoute 5 jour => semaine 1
si on ajoute 6 jour => semaine 1
si on ajoute 7 jour => semaine 2
une semaine faisant bien 7 jours, notre lundi aurais du faire partie de la semaine 1...
9 sept. 2009 à 10:58
Public Function GetISOWeek(ByVal vdInput As Date) As Long
GetISOWeek = DatePart("ww", vdInput, vbMonday, vbFirstFourDays)
If GetISOWeek >52 And DatePart("ww", vdInput + 7, vbMonday, vbFirstFourDays) 2 Then
GetISOWeek = 1
End If
End Function
en gros, une simple correction de la fonction VB:
si la semaine est la 52 (ou plus)
si en ajoutant 7 jours on passe à la semaine 2 ; la semaine considérée devrait être la semaine 1
9 sept. 2009 à 10:55
La semaine précédente était la 53 (28 déc 2008 au 3 janv 2009)
Pas simples ces histoires de semaines...
9 sept. 2009 à 10:51
En tous cas, merci beaucoup pour les divers tuyaux des uns et des autres.
9 sept. 2009 à 10:37
date moi sechaud
28/12/1992 53 1
29/12/1992 53 1
30/12/1992 53 1
31/12/1992 53 1
01/01/1993 53 1
02/01/1993 53 1
03/01/1993 53 1
28/12/1998 53 1
29/12/1998 53 1
30/12/1998 53 1
31/12/1998 53 1
01/01/1999 53 1
02/01/1999 53 1
03/01/1999 53 1
9 sept. 2009 à 10:36
date moi jack
01/01/1999 53 52
02/01/1999 53 52
03/01/1999 53 1
10/01/1999 1 2
17/01/1999 2 3
24/01/1999 3 4
31/01/1999 4 5
07/02/1999 5 6
après, j'ai validé mes résultats avec les exemples dispos sur le wiki et qui me semblent corrects...
9 sept. 2009 à 10:29
Si on fait DatePart("w", Now, vbMonday, vbFirstFourDays)
on découvre qu'aujourd'hui, on serait un mardi, alors qu'on est mercredi.
Il faut donc passer sur vbSunday comme premier jour de la semaine pour que le jour de la semaine soit correcte.
Le calcul du numéro de la semaine doit donc utiliser vbSunday pour être correct
DatePart("ww", "31/12/1951", vbSunday, vbFirstFourDays)
9 sept. 2009 à 10:28
Après recherche dans mes archives, je propose cette méthode qui semble plus juste:
Private Sub Command1_Click()
Dim LaDate As Variant
Dim Semaine As Byte
LaDate = Text1.Text 'Entrer la date sous la forme 09/09/2009 par ex.
Semaine = CByte(DatePart("ww", LaDate, vbMonday, vbFirstFourDays)) Mod 53
If Semaine = 0 Then
Semaine = 1
End If
Text2.Text = Semaine
End Sub
9 sept. 2009 à 10:18
non, ca ne me gène pas, c'est le même numéro de semaine, mais pas de la même année ^^
9 sept. 2009 à 10:13
Je pense que la bonne méthode est la fonction datepart détaillée par jack, et pour une fois on a une fonction VB6 qui fonctionne correctement.
9 sept. 2009 à 09:57
Public Function GetISOWeekNumber(ByVal vdInput As Date) As Long
Dim nWeek As Long
Dim nYear As Long
nYear = Year(vdInput)
nWeek = DatePart("ww", vdInput, vbMonday, vbFirstFourDays)
If nWeek >= 52 Then
If DatePart("ww", vdInput + 7, vbMonday, vbFirstFourDays) = 2 Then
nWeek = 1
nYear = nYear + 1
ElseIf Month(vdInput) = 1 Then
nYear = nYear - 1
End If
ElseIf nWeek 1 And Month(vdInput) 12 Then
nYear = nYear + 1
End If
GetISOWeekNumber = nWeek
End Function
et là, j'ai un résultat correct.
date moi jack
31/12/1951 1 53
30/12/1963 1 53
29/12/1975 1 53
31/12/1979 1 53
30/12/1991 1 53
29/12/2003 1 53
31/12/2007 1 53
30/12/2019 1 53
29/12/2031 1 53
31/12/2035 1 53
30/12/2047 1 53
enfin, à en croire les dates exemples du Wiki :p
le code de notre ami vb5zh se plante également (par rapport à mon code) :
date moi vb5zh
01/01/1990 1 53
02/01/1990 1 53
03/01/1990 1 53
31/12/1990 1 53
01/01/1991 1 53
02/01/1991 1 53
03/01/1991 1 53
30/12/1991 1 53
31/12/1991 1 53
01/01/1992 1 53
02/01/1992 1 53
03/01/1992 1 53
03/01/1994 1 53
02/01/1995 1 53
03/01/1995 1 53
01/01/1996 1 53
02/01/1996 1 53
03/01/1996 1 53
30/12/1996 1 53
31/12/1996 1 53
01/01/1997 1 53
02/01/1997 1 53
03/01/1997 1 53
29/12/1997 1 53
30/12/1997 1 53
31/12/1997 1 53
01/01/1998 1 53
02/01/1998 1 53
03/01/1998 1 53
03/01/2000 1 53
9 sept. 2009 à 09:51
- 1er jour de la semaine = Dimanche
- 1ère semaine : vbUseSystem
et tu auras un problème dès le 1er janvier 2010 !
D'ailleurs, dans le calendrier de Outlook, il faut aller modifier les paramètres afin d'avoir un n° de semaine compatible à l'europe (par défaut, semaine 1 = semaine du 1er janvier)
9 sept. 2009 à 09:46
http://fr.wikipedia.org/wiki/Num%C3%A9rotation_ISO_des_semaines
Vérifie avec de vieux agendas, ça fonctionne.
Exemple : Le 29 déc 2008 faisait bien partie de la semaine 1 de 2009, et en aucun cas la 53 (au pire la 52)
Exemple : 2009 aura 53 semaines, la semaine 1 commencera le 4 janvier 2010.
9 sept. 2009 à 09:35
bref exemple:
date sechaud vb5zh
01/01/2000 1 52
02/01/2000 2 52
03/01/2000 2 53
04/01/2000 2 1
05/01/2000 2 1
06/01/2000 2 1
07/01/2000 2 1
08/01/2000 2 1
09/01/2000 3 1
[...]
25/12/2000 53 52
26/12/2000 53 52
27/12/2000 53 52
28/12/2000 53 52
29/12/2000 53 52
30/12/2000 53 52
31/12/2000 54 52
9 sept. 2009 à 09:28
nbSemaines = DatePart("ww", Now)
J'utilise ce code avec satisfaction depuis pas mal de temps.
9 sept. 2009 à 01:01
date Jack vb5zh
29/12/2008 1 53
30/12/2008 1 53
31/12/2008 1 53
01/01/2009 1 53
02/01/2009 1 53
03/01/2009 1 53
03/01/2011 1 53
pas exploitable en l'etat, en faire une fonction.
voir sur le même sujet:
http://www.codyx.org/snippet_numerotation-iso-semaines_756.aspx
9 sept. 2009 à 00:22
Je vais te décevoir ...
Copie ça dans la fenêtre de debug de VB :
? DatePart("ww", now, vbMonday, vbFirstFourDays)