Connaitre le N° de semaine à partir d'une Date!

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Connaitre le N° de semaine à partir d'une Date!

Message par nico »

Salut,

Est-ce que quelqu'un sait comment obtenir le N° de semaine à partir d'une Date!
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Peut etre en fesant : DayOfYear(Date) / 7

Enfin c'est juste une proposition...
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

si on veut faire les choses bien il faut la norme ISO 8601.
ce qui donne en principe cette fonction :

Code : Tout sélectionner

Procedure.l Week(date.l) ; Return the week number of the specified date.
  Protected a.l = (14 - Month(date)) / 12
  Protected y.l = Year(date) + 4800 - a
  Protected m.l = Month(date) + 12 * a - 3
  Protected j.l = Day(date) + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045
  Protected t.l = (j + 31741 - (j % 7)) % 146097 % 36524 % 1461
  ProcedureReturn (((t - (t / 1460)) % 365) + (t / 1460)) / 7 + 1
EndProcedure

Debug Week(Date())
Debug Week(Date(2006,11,23,15,30,30))
Debug Week(AddDate(Date(), #PB_Date_Week, 12))
Debug Week(AddDate(Date(), #PB_Date_Week, 25))
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ou en décomposant en deux fonctions :

Code : Tout sélectionner

Procedure.l JulianDay(date.l) ; Return the julian day of the specified date.
  Protected a.l = (14 - Month(date)) / 12
  Protected y.l = Year(date) + 4800 - a
  Protected m.l = Month(date) + (12 * a) - 3
  Protected j.l = Day(date) + (((153 * m) + 2) / 5) + (365 * y) + (y / 4) - (y / 100) + (y / 400) - 32045
  ProcedureReturn j
EndProcedure

Procedure.l WeekOfYear(date.l) ; Return the week number of the specified date.
  Protected j.l = JulianDay(date)
  Protected t.l = (((j + 31741 - (j % 7)) % 146097) % 36524) % 1461
  Protected w.l = ((((t - (t / 1460)) % 365) + (t / 1460)) / 7) + 1
  ProcedureReturn w
EndProcedure

d = Date(2007,1,1,0,0,0)

For i = 0 To 365
  Debug WeekOfYear(AddDate(d, #PB_Date_Day, i))
Next

Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Super! :D
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Connaitre le N° de semaine à partir d'une Date!

Message par Patrick88 »

nico a écrit :Salut,

Est-ce que quelqu'un sait comment obtenir le N° de semaine à partir d'une Date!
facile , tu regardes sur un calendrier...

:lol: :roll:

pat
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est ce que j'ai fait pour vérifier que le code fonctionnait bien! :wink:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Il y a juste un petit problème apparemment concernant la '53ème' semaine.

En principe, on s'accorde à dire qu'il y a 52 semaines mais parfois il y a un bout de 53ème semaine à cheval avec la 1ère semaine de l'année suivante.

Le souci c'est que ce code retourne 1 dans ce cas précis et non 53.
mais en même temps c'est vrai aussi c'est la semaine 1 de l'année suivante :roll:

Faut juste le savoir....
Image
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

dans ce cas il faut se baser sur l'année, ou le mois, si c'est en décembre c'est la semaine 53
si décembre et semaine = 1 alors semaine = 53

Dri
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oui pourquoi pas. mais je ne sais si c'est ISO de faire comme çà.

en tout cas voici ce que çà donne :

Code : Tout sélectionner

Procedure.l JulianDay(date.l) ; Return the julian day of the specified date.
  Protected a.l = (14 - Month(date)) / 12
  Protected y.l = Year(date) + 4800 - a
  Protected m.l = Month(date) + (12 * a) - 3
  Protected j.l = Day(date) + (((153 * m) + 2) / 5) + (365 * y) + (y / 4) - (y / 100) + (y / 400) - 32045
  ProcedureReturn j
EndProcedure

Procedure.l WeekOfYear(date.l) ; Return the week number of the specified date.
  Protected j.l = JulianDay(date)
  Protected t.l = (((j + 31741 - (j % 7)) % 146097) % 36524) % 1461
  Protected w.l = ((((t - (t / 1460)) % 365) + (t / 1460)) / 7) + 1
  If w = 1 And Month(date) = 12 : w = 53 : EndIf
  ProcedureReturn w
EndProcedure

d = Date(2007,1,1,0,0,0)

For i = 0 To 364
  Debug WeekOfYear(AddDate(d, #PB_Date_Day, i))
Next 
Image
Répondre