Page 1 sur 1

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

Publié : ven. 05/janv./2007 18:52
par nico
Salut,

Est-ce que quelqu'un sait comment obtenir le N° de semaine à partir d'une Date!

Publié : ven. 05/janv./2007 18:56
par wolfjeremy
Peut etre en fesant : DayOfYear(Date) / 7

Enfin c'est juste une proposition...

Publié : ven. 05/janv./2007 20:07
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))

Publié : ven. 05/janv./2007 20:26
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


Publié : ven. 05/janv./2007 20:39
par nico
Super! :D

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

Publié : sam. 06/janv./2007 12:34
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

Publié : sam. 06/janv./2007 12:54
par nico
C'est ce que j'ai fait pour vérifier que le code fonctionnait bien! :wink:

Publié : sam. 06/janv./2007 18:10
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....

Publié : sam. 06/janv./2007 18:20
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

Publié : sam. 06/janv./2007 22:00
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