NUMÉRO DE SEMAINE

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 9 sept. 2009 à 00:22
cs_fonio Messages postés 56 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 15 février 2013 - 3 janv. 2013 à 14:59
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50539-numero-de-semaine

cs_fonio Messages postés 56 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 15 février 2013 1
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és 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Derniè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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 1174 Date d'inscription vendredi 8 avril 2005 Statut Membre Derniè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 ...

NumSemaine = DatePart("ww", DateSerial(Year(Date), Month(Date), Day(Date)), vbMonday, vbFirstFourDays)

A voir ...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 288 Date d'inscription jeudi 28 octobre 2004 Statut Membre Derniè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és 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Derniè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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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és 288 Date d'inscription jeudi 28 octobre 2004 Statut Membre Derniè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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 sept. 2009 à 10:37
sechaud, même chose:
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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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és 288 Date d'inscription jeudi 28 octobre 2004 Statut Membre Derniè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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 8 Date d'inscription jeudi 17 août 2000 Statut Membre Dernière intervention 21 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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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


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
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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és 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 sept. 2009 à 09:35
Non, le résultat n'est encore pas identique...

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
Sechaud Messages postés 288 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 3 janvier 2017
9 sept. 2009 à 09:28
Le code de jack marche très bien si on le simplifie:
nbSemaines = DatePart("ww", Now)
J'utilise ce code avec satisfaction depuis pas mal de temps.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 sept. 2009 à 01:01
Non Jack, ton code se plante sur un très grand nombre de dates... utilisant cette norme :

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
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 sept. 2009 à 00:22
Aïe aïe aïe
Je vais te décevoir ...
Copie ça dans la fenêtre de debug de VB :
? DatePart("ww", now, vbMonday, vbFirstFourDays)
Rejoignez-nous