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... :wink:

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 ! :D

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.... :oops:

En tout cas, merci à toi aussi pour ce code très utile. :D

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 :oops:) :

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... :roll:

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+