Numéro de la semaine.

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Numéro de la semaine.

Message par Chris »

Est-ce que quelqu'un sait si il y a un moyen de connaitre les règles pour numéroter les semaines, et comment connaître le n° de la semaine par rapport à une date.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Fonction en C ici http://www.csharpfr.com/code.aspx?ID=30827
soit :

Code : Tout sélectionner

int NumeroSemaine(DateTime ParamMaDate)
{ 
  //par Mercusyo
  // Norme internationale ISO-8601 : http://www.auduteau.net/calendar/cal5.shtml
  // Cf. Paragraphe : 5.8 Comment calculer le numéro de semaine ?

  int iNumSemaine;
  int iNumeroJourJulien = 0;
  int iCalculJuliena, iCalculJulieny, iCalculJulienm;
  int id1, id4, iL;

  // Calcul du numéro de semaine du calendrier Julien ...
  iCalculJuliena = (14 - ParamMaDate.Month) / 12;
  iCalculJulieny = ParamMaDate.Year + 4800 - iCalculJuliena;
  iCalculJulienm = ParamMaDate.Month + 12*iCalculJuliena - 3;
  iNumeroJourJulien = ParamMaDate.Day + (153*iCalculJulienm + 2)/5 + 365*iCalculJulieny
                       + iCalculJulieny/4 - iCalculJulieny/100 + iCalculJulieny/400
                       - 32045;
 
  id4 = (iNumeroJourJulien+31741-(iNumeroJourJulien%7))%146097%36524%1461;
  iL = id4/1460;
  id1 = ((id4-iL)%365)+iL;

  // Calcul du numéro de semaine "classique" ...
  iNumSemaine = id1/7 + 1;
  return iNumSemaine;
}
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

Tiens voici mon code :

Code : Tout sélectionner

Procedure Semaine(Annee, Mois, Jour)
  a = 1
  While DayOfWeek(Date(Annee, 1, a, 1, 0, 0)) <> 1
    a = a + 1
  Wend
  nombre_jour.l = DayOfYear(Date(Annee, Mois, Jour,1,0,0)) - a + 1
  semaine.l = Round(nombre_jour / 7, 1)
  ProcedureReturn semaine
EndProcedure

Debug Semaine(2005, 7 , 4)
J'ai mis un moment avant de trouver mon erreur ^^.

Normalement il marche bien
Dernière modification par Dorian le jeu. 12/janv./2006 0:06, modifié 2 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Merci. Je regarderai ça :)
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

Rectification il merde avec l'année 2004 :?

Mais lorsque j'ai fais des tests avec 2005 sa marche donc je regarderai demain ^^

EDIT : Sa merde avec une partie de 2004 grrrrr je comprend plus rien :(

ex : 29 fev 2004, 30 fev 2004, 1 jan 2004, 11 jan 2005 sa marche nikel

2 aout 2004, 31 dec 2004 sa merde :mad: :cry: 8O ^^
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Code : Tout sélectionner

Procedure.b NumeroSemaine(annee, mois, jour)
  ; Norme internationale ISO-8601 : http://www.auduteau.net/calendar/cal5.shtml
  ; Cf. Paragraphe : 5.8 Comment calculer le numéro de semaine ?

  ; Calcul du numéro de semaine du calendrier Julien ...
  iNumeroJourJulien = 0
  iCalculJuliena = (14 - mois) / 12
  iCalculJulieny = annee + 4800 - iCalculJuliena
  iCalculJulienm = mois + 12 * iCalculJuliena - 3
  iNumeroJourJulien = jour + (153 * iCalculJulienm + 2) / 5 + 365 * iCalculJulieny
  iNumeroJourJulien = iNumeroJourJulien + iCalculJulieny / 4 - iCalculJulieny / 100 + iCalculJulieny / 400 - 32045
  id4 = (iNumeroJourJulien + 31741 - (iNumeroJourJulien % 7)) % 146097 % 36524 % 1461
  iL = id4 / 1460
  id1 = ((id4-iL) % 365) + iL

  ; Calcul du numéro de semaine "classique" ...
  iNumSemaine = id1 / 7 + 1
  ProcedureReturn iNumSemaine
EndProcedure

NumWeek.b = NumeroSemaine(2004, 12 , 31)

If OpenConsole()
    Print("Numero de Semaine pour 31/12/2005 = ")
    PrintN(Str(NumWeek))

    PrintN("Appuyer sur 'Return' pour quitter.")
    Input()
    CloseConsole()
EndIf
End
Ca marche mieux !!!
Dernière modification par flaith le jeu. 12/janv./2006 21:01, modifié 1 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Dorian a écrit :Rectification il merde avec l'année 2004 :?

Mais lorsque j'ai fais des tests avec 2005 sa marche donc je regarderai demain ^^

EDIT : Sa merde avec une partie de 2004 grrrrr je comprend plus rien :(

ex : 29 fev 2004, 30 fev 2004, 1 jan 2004, 11 jan 2005 sa marche nikel

2 aout 2004, 31 dec 2004 sa merde :mad: :cry: 8O ^^
A mon avis, si ça marche pour le 30 Fevrier, c'est qu'il y a un TRES TRES gros bug :lol:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

@flaith

Ca marche nickel, on dirait :)
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

J'avais posté ça il y a quelque temps

Code : Tout sélectionner

;/ Return the week count of the year

ProcedureDLL Week(Date.l)
  
  Compteur=Date(Year(Date),1,1,0,0,1) ;/ New year day
  
  ;/ Goto 1st monday 
  Repeat
    If DayOfWeek(Compteur)=1 : Break : EndIf
    Compteur=AddDate(Compteur,#PB_Date_Day,1)
  ForEver
  
  ;/ Add 1 week / Test if date is reach
  Repeat
    If Compteur>Date : Break : EndIf
    Compteur=AddDate(Compteur,#PB_Date_Week,1)
    Week+1
  ForEver
  
  ProcedureReturn Week
EndProcedure
  
;/ Test  
; MessageRequester("Week n°",Str(Week(Date())),#MB_ICONINFORMATION)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Chris a écrit :@flaith
Ca marche nickel, on dirait :)
oui ca marche impec :D
Répondre