Date => Numéro de semaine

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Date => Numéro de semaine

Message 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:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Date => Numéro de semaine

Message par Backup »

Merci :)

ça va rejoindre ma collection de code sur les dates :)
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Date => Numéro de semaine

Message par kelebrindae »

Très utile ! :D

Comme Dobro, j'intègre de ce pas le code à mon répertoire "trucs à garder précieusement".
Merci!
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Re: Date => Numéro de semaine

Message par Fred »

Sympa ;)
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Date => Numéro de semaine

Message 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)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Date => Numéro de semaine

Message par Ar-S »

cool, merci à vous deux.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Date => Numéro de semaine

Message 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))
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Date => Numéro de semaine

Message 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
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Date => Numéro de semaine

Message 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))
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Date => Numéro de semaine

Message 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:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
gdb
Messages : 1
Inscription : mer. 10/nov./2010 11:11

Re: Date => Numéro de semaine

Message 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+
Répondre