Page 1 sur 1
Date => Numéro de semaine
Publié : dim. 31/oct./2010 15:14
par Fig
Bonjour,
Juste un fonction qui prend en entrée une date et retourne le numéro de la semaine.
C'est très utile dans le milieu professionnel où l'on se sert souvent des numéros de semaine pour la planification des tâches.
Code : Tout sélectionner
Procedure WeekOfYear(s)
;d contient le jour de la semaine du 1er janvier de l'année
d=DayOfWeek(Date(Year(s),01,01,00,00,00))
If d=0:d=7:EndIf
If d<=4 ;lundi, mardi, mercredi, jeudi
dd=9-d
Else ;vendredi, samedi, dimanche
dd=d-9
EndIf
dd=DayOfYear(s)+dd
dd=Round(dd/7,0)+1
If dd=0:dd=WeekOfYear(Date(Year(s)-1,12,29,08,0,0)):EndIf
ProcedureReturn dd
EndProcedure
;exemple: affiche le numéro de semaine du 4 janvier 2010 à 8h00 du matin
Debug WeekOfYear(Date(2010,01,04,08,0,0))
En espérant que cela vous sera utile...

Re: Date => Numéro de semaine
Publié : dim. 31/oct./2010 18:03
par Backup
Merci
ça va rejoindre ma collection de code sur les dates

Re: Date => Numéro de semaine
Publié : mar. 02/nov./2010 11:25
par kelebrindae
Très utile !
Comme Dobro, j'intègre de ce pas le code à mon répertoire "trucs à garder précieusement".
Merci!
Re: Date => Numéro de semaine
Publié : mar. 02/nov./2010 11:57
par Fred
Sympa

Re: Date => Numéro de semaine
Publié : mar. 02/nov./2010 12:24
par Patrick88
et l'inverse, numero de semaine vers date
Code : Tout sélectionner
Procedure.s SemaineVersDate(numero_semaine.b); ,format_retour.b)
Protected annee.w, nb_jour.w, date_1erjour_annee.l, date_semaine.s
annee = Year(Date())
nb_jour = 7*(numero_semaine-1)
date_1erjour_annee = ParseDate("%dd/%mm/%yyyy", "01/01/"+Str(annee))
date_semaine = FormatDate("%dd/%mm/%yyyy", AddDate(date_1erjour_annee, #PB_Date_Day, nb_jour-1))
;s_result.s = Str(w_annee)+"/"+Str(b_mois)+"/"+Str(b_jour)
ProcedureReturn date_semaine
EndProcedure
Debug SemaineVersDate(38) ; --> "16/09/2010"
Debug SemaineVersDate(2) ; --> "07/01/2010"
; IDE Options = PureBasic 4.20 (Windows - x86)
Re: Date => Numéro de semaine
Publié : mar. 02/nov./2010 12:59
par Ar-S
cool, merci à vous deux.
Re: Date => Numéro de semaine
Publié : mar. 02/nov./2010 14:58
par Cls
Attention, ce numéro de semaine n'est pas au format ISO-8601. Par exemple la date du 30/12/2008 donne semaine 54, ce qui n'existe pas.
La fonction aux normes ISO :
Code : Tout sélectionner
Procedure.i DayOfWeekIso8601(date)
If DayOfWeek(date) = 0
ProcedureReturn 7
Else
ProcedureReturn DayOfWeek(date)
EndIf
EndProcedure
Procedure.i WeekOfYearIso8601(s)
Jour.i = 24 * 3600
numeroSemaine.i
;Détermine le jeudi de la semaine à vérifier
Jeudi.i = s + 4 * Jour - DayOfWeekIso8601(s) * Jour
; Calcule le premier lundi de l'année
Janvier04.i = Date(Year(jeudi), 1, 4, 0, 0, 0)
Lundi04.i = Janvier04 - DayOfWeekIso8601(Janvier04)
; Ecart entre ces dates
Ecart.i = DayOfYear(Jeudi) - DayOfYear(Lundi04)
numeroSemaine.i = Int(Ecart / 7 + 0.5) + 1
ProcedureReturn numeroSemaine
EndProcedure
; Test
Debug WeekOfYearIso8601(Date(2008, 12, 30, 8, 0, 0))
Debug WeekOfYearIso8601(Date(2005, 1, 1, 8, 0, 0))
Re: Date => Numéro de semaine
Publié : mer. 03/nov./2010 10:23
par kelebrindae
@Cls :
Euh... Bizarrement, ton code me donne "1" pour le numéro de semaine du 30/12/2008.
Et "53" pour "WeekOfYearIso8601(Date(2005, 1, 1, 8, 0, 0))".
N'y aurait-il pas un souci ?
[EDIT]
Je n'ai rien dit! Je viens de lire la norme ISO 8601 et je comprends pourquoi le 30/12/2008 appartient à la semaine 1: la semaine 1 est celle qui contient le premier jeudi de l'année.
=> tu as donc tout juste, et je ferme ma g....
En tout cas, merci à toi aussi pour ce code très utile.

Re: Date => Numéro de semaine
Publié : mer. 03/nov./2010 11:15
par Cls
Pas de souci kelebrindae. J'ai fais que la moitié du boulot en ne proposant que le numéro de semaine, je rajoute la fonction pour calculer l'année (testé vite fait

) :
Code : Tout sélectionner
;
; Numéro de semaine et année au format ISO8601
;
; Auteur : Cls
; Plus d'infos sur ISO8601 : http://www.techno-science.net/?onglet=glossaire&definition=3075
;
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; Renvoi le numero du jour
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure.i DayOfWeekIso8601(date)
If DayOfWeek(date) = 0
ProcedureReturn 7
Else
ProcedureReturn DayOfWeek(date)
EndIf
EndProcedure
; Renvoi le numéro de semaine
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure.i WeekOfYearIso8601(s)
Jour.i = 24 * 3600
numeroSemaine.i
; Détermine le jeudi de la semaine à vérifier
Jeudi.i = s + 4 * Jour - DayOfWeekIso8601(s) * Jour
; Calcule le premier lundi de l'année
Janvier04.i = Date(Year(jeudi), 1, 4, 0, 0, 0)
Lundi04.i = Janvier04 - DayOfWeekIso8601(Janvier04)
; Ecart entre ces dates
Ecart.i = DayOfYear(Jeudi) - DayOfYear(Lundi04)
numeroSemaine.i = Int(Ecart / 7 + 0.5) + 1
ProcedureReturn numeroSemaine
EndProcedure
; Renvoi l'année
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure.i YearIso8601(s)
Jour.i = 24 * 3600
Jeudi.i = s + 4 * Jour - DayOfWeekIso8601(s) * Jour
ProcedureReturn Year(Jeudi)
EndProcedure
; Test
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
date.i = Date(2008, 12, 30, 8, 0, 0)
Debug "Semaine n°" + Str(WeekOfYearIso8601(date)) + " de l'année " + Str(YearIso8601(date))
date.i = Date(2005, 1, 1, 8, 0, 0)
Debug "Semaine n°" + Str(WeekOfYearIso8601(date)) + " de l'année " + Str(YearIso8601(date))
Re: Date => Numéro de semaine
Publié : mer. 03/nov./2010 12:55
par Fig
Code : Tout sélectionner
Procedure WeekOfYear(s)
;d contient le jour de la semaine du 1er janvier de l'année
d=DayOfWeek(Date(Year(s),01,01,00,00,00))
If d=0:d=7:EndIf
If d<=4 ;lundi, mardi, mercredi, jeudi
dd=7-d
Else ;vendredi, samedi, dimanche
dd=d-7
EndIf
dd=DayOfYear(s)+dd
dd=Round(dd/7,0)+1
If dd=0:dd=WeekOfYear(Date(Year(s)-1,12,31,08,0,0)):EndIf
ProcedureReturn dd
EndProcedure
;exemple: affiche le numéro de semaine du 4 janvier 2010 à 8h00 du matin
Debug WeekOfYear(Date(2009,12,31,08,0,0))
C'est bon là ? Je ne sais pas pourquoi j'avais mis un "9" dans la formule au lieu d'un 7...

Re: Date => Numéro de semaine
Publié : mer. 10/nov./2010 15:52
par gdb
@Cls :
je te remercie pour tes procédures, je cherchais justement comment calculer le numéro de semaine
ta procédure va très bien, sauf pour l'année 1999 où le numéro de semaine est majoré de 1 ?
je débute tout juste aussi je ne sais pas pourquoi, ce serait cool de m'expliquer comment rectifier
Merci à toi
a+