begin process at 2010 02 10 06:43:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date / Heure

 > CALCUL DU NUMÉRO DE SEMAINE

CALCUL DU NUMÉRO DE SEMAINE


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Date / Heure Source .NET ( DotNet ) Classé sous :semaine, numéro Niveau :Débutant Date de création :18/04/2005 Vu :28 129

Auteur : Mercusyo

Ecrire un message privé
Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note

 Description

pour tout ceux qui veulent avoir une petite fonction, permettant de connaitre le numéro de semaine, en fonction d'une date.
Car, j'ai eu quelques surprises quant à l'utilisation de la fonction C#, qui ne fonctionne pas pour le 31/12/2007, et bien d'autres dates .....

Source

  • public int NumeroSemaine(DateTime ParamMaDate)
  • {
  • /* 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 ;
  • }
public int NumeroSemaine(DateTime ParamMaDate)
		{
			/* 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 ;
		}



 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) CALCUL DATES & JOURS FÉRIÉS par DCTC33
Source avec Zip Source avec une capture Source .NET (Dotnet) DIFFÉRENCE DE TEMPS, XML, POCKETPC / WINFORMS...... par Steph115
Source avec Zip Source avec une capture Source .NET (Dotnet) HORLOGE/ALARME NUMÉRIQUE par Bio3G
Source avec Zip Source avec une capture Source .NET (Dotnet) COMPTE À REBOURS par Azema
Source .NET (Dotnet) CLASSE DATE AVEC QUELQUES FONCTIONS par ricklekebekoi

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) RICHTEXTBOX NUMÉROTÉ (NUMÉROS DE LIGNES) par jray
Source .NET (Dotnet) PREMIER JOUR D'UNE SEMAINE par daivil

Commentaires et avis

Commentaire de plopman le 18/04/2005 17:05:46

Je trouve ca assez intéressant ! Bonne continuation.

Commentaire de gluk le 30/06/2005 17:49:28

Super code,
merci beaucoup pour ton aide,
@+

Commentaire de Horfee le 26/07/2005 10:18:41

je suis tombé sur le meme site que toi lors de la recherche de ce calcul. Mon code ne donne pas le bon jours malheureusement. J'ai remarqué une différence de code, entre le tiens et le mien qui est le meme que celui du site : le calcul de la ligne 13 est tiré du calcul du jour grégorien. Or ensuite tu te base sur le calcul du jour julien... Est ce normal ?

Commentaire de gluk le 26/07/2005 12:27:44

lol

Commentaire de Mercusyo le 25/08/2005 20:55:23

Désolé pour la réponse tardive.
Je ne me souviens plus bien, mais j'ai suivis scrupuleusement l'algorithme du site internet que j'ai mis en commentaire ... j'ai fais des essais jusque très loin au niveau année, style l'an 2090, je ne me souviens plus trop, et çà fonctionnait.
Merci pour vos commentaires ;o))
@+

Commentaire de Horfee le 26/08/2005 14:25:33

il me semble avoir trouvé une facon un peu plus rapide ( il faut simplement verifier que cela marche pour bcp de date : je n'est testé que sur certains cas normaux et certains cas speciaux)
a partir de la date d1, on cherche le quantieme (facile a avoir).
Ensuite on enleve x jours :
si le 1/01/2005 = Lundi --> on enleve 0 jours
                = Mardi --> on enleve 1 jour
                = Mercredi --> on enleve 2 jours
etc...
On divise le tout par 7.
On arrondi a l'entier inferieur (ceiling il me semble)
On ajoute 1
Et voilà
Donc a tester et/ou me donner votre avis

Commentaire de toudilesptits le 01/12/2005 10:17:49

Il me semble que ce qui suit est également plus simple :

n° de semaine=arrondi((date du jour - 01/01/date de l'année en cours)/7 + 0.5)

Merci pour vos avis.

Commentaire de slaf83 le 14/12/2005 13:21:18

Ce code est parfait !
Les approximations données sont fausses car une norme est une norme !

Commentaire de toudilesptits le 15/12/2005 08:14:42

Pour ma part, j'utilise toujours ce calcul et je n'ai jamais eu d'erreurs (depuis 5 ans).
Une petite modification cependant, ce n'est pas arrondi mais bien entier qui est utilisé, soit :

n° de semaine=entier((date du jour - 01/01/date de l'année en cours)/7 + 0.5)

Voilà.

Commentaire de spottydj le 03/01/2006 20:54:14

Bonjour,

Je m'incruste ici, et propose une solution qui utilise bien l'architecture .NET, si vous utilisez Visual Studio.

Pour ma part, j'ai utilisé la fonction DatePart() présente en VB.NET.
J'ai donc ajouté une référence à la bibliothèque Microsoft VisualBasic .NET Runtime dans mon projet, puis pour des raison de longueur de ligne (j'ai la flemme oui :D) j'ai fais au début de mon code un
using Microsoft.VisualBasic;

Au final, pour récupérer le numéro de semaine :

int num = DateAndTime.DatePart(DateInterval.WeekOfYear,laDate,FirstDayOfWeek.Saturday,FirstWeekOfYear.FirstFullWeek)

DateInterval.WeekOfYear pour indiquer que l'on veut le numéro de semaine.
FirstDayOfWeek.Saturday pour indiquer que la semaine va du samedi au samedi.
FirstWeekOfYear.FirstFullWeek pour dire que l'on veut compter à partir de la première semaine complète.

Il n'y a qu'à suivre la complétion de Visual Studio pour moduler le résultat DatePart() à votre guise ;)

Commentaire de spottydj le 12/01/2006 10:11:19

J'ai trouvé sur le forum une autre manière simple de le retrouver, et qui évite de faire référence à VB, merci à MorpionMX.

using System.Globalization;

int week = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now,CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

Commentaire de nimzo78 le 26/02/2006 23:32:29

Quand on calcul un numéro de semaine, il me semble utile de renvoyer aussi l'information sur l'année, qui n'est pas forcément l'année de la date passée en paramètre.

J'ai écrit une fonction qui calcule les 2. La semaine peut être calendaire (MinDayForWeekOk = 4), ou de n'importe quelle autre type : mettez le nombre de jours minimum dans l'année pour que la semaine soit prise en compte dans celle-ci dans la variable 'MinDayForWeekOk'. J'ai mis 4 en dur  pour ici, car on ne parle dans ce forum que d'année calendaire.

Initialement, cette fonction tenait compte aussi d'un décalage. Une semaine pouvait commencer un dimanche par exemple. Je l'ai simplifié en direct, en espérant n'avoir pas commis de bévu.

Elle a été testée sur de nombreuses années et cas particuliers, mais si quelqu'un trouve une faille, je suis preneur.


private void GetWeekAndYear(DateTime DateRef, out int NoWeek, out int Year)
{
  //Nbr de jour minimum pour faire une semaine
  int MinDayForWeekOk = 4; // Semaine calendaire, à modifier le cas-échéant

  int WeekDayAfterDec = this.GetWeekDay(DateRef);

  //cas particuliers ou la semaine pourrait se retrouver dans l'année précédent celle de DateRef ou l'annee suivante
  Year = DateRef.Year - (int)Convert.ToInt16((WeekDayAfterDec - DateRef.Day >=
                                             ( 8-MinDayForWeekOk)) && (DateRef.Month == 1)) +
(int)Convert.ToInt16((DateRef.Month == 12) && (DateRef.Day -
                                              WeekDayAfterDec >= (24+MinDayForWeekOk)));

  //premier jour de l'année
  DateTime FirstDayYear = new DateTime(Year,1,1);

  //numéro du premier jour de l'année
  int WeekDayFirstDayYear = this.GetWeekDay(FirstDayYear);

  //no de semaine
  NoWeek = DateRef.Subtract(FirstDayYear.AddDays(WeekDayAfterDec - WeekDayFirstDayYear)).Days / 7
+ (int)(Convert.ToInt16(WeekDayFirstDayYear <(9-MinDayForWeekOk)));
}

Commentaire de nimzo78 le 27/02/2006 11:45:57

Un petit mot sur la solution de toudilesptits :

"n° de semaine=entier((date du jour - 01/01/date de l'année en cours)/7 + 0.5)"

Que se passe t-il le 31 décembre 2003 par exemple ?

C'est la première semaine de 2004 (comme le 29 et le 30), et non la 53 eme de 2003 !




Commentaire de spottydj le 27/02/2006 12:40:54

Ma solution prend tous ces paramètres en compte,

using System.Globalization;

int week = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now,CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

Dans cette fonction de Microsoft .NET, le premier paramètre est notre date de type DateTime, le deuxieme paramère est la regle pour le calcul des semaines (FirstFourDayWeek, FirstFullWeek...) et le troisième parametre est le premier jour de la semaine, pour le calcul aussi (Monday, Tuesday...)

Nimzo78 :
L'année est forcément dans la date de l'année passée en paramètre, puisque que comme tu le dis, le 31 décembre 2003 est dans la première semaine de 2004...
Ils sont doués chez Microsoft :D

Commentaire de nimzo78 le 27/02/2006 19:49:35

Ta solution fonctionne très bien aussi. Cela n'a pas toujours été le cas avec les méthodes microsoft (je pense au vb6 qui proposait une méthode équivalente mais buggé).

Par contre je ne comprends pas ta remarque : "L'année est forcément dans la date de l'année passée en paramètre, puisque que comme tu le dis, le 31 décembre 2003 est dans la première semaine de 2004..."

Le 31 décembre 2003 représente la semaine 1 de l'année 2004. L'année est alors 2004 et non l'année 2003 passée en paramètre. J'ai pas du bien comprendre ce que tu voulais dire.

Commentaire de spottydj le 27/02/2006 20:53:40

Ben d'une manière ou d'une autre, la fonction retourne le numéro 1 pour le 31 decembre 2003, et pas le n° 52 :p

Commentaire de nimzo78 le 27/02/2006 21:11:16

Oui peut-être, mais on ne connais pas l'année. Il faut refaire des tests pour savoir de quelle année il s'agit : si mois=12 et no semaine retourné = 1 alors annee++, si mois = 1 et no semaine retouné >=52 alors annee--;

Pas grans chose c'est sure... mais autant l'inclure dans la fonction, car un numéro de semaine sans l'année, ne veut souvent pas dire grand chose.

Bref, ta fonction .net fonctionne surement (je n'ai pas testé, car la précédente de vb6 ne fonctionnait pas, et que j'en avais une qui marchait).

J'ai donné ma fonction à titre indicatif pour le coté algorithmique de la chose, pour ceux à qui cela peut intéresser.

a++

Commentaire de flysun le 16/08/2006 14:55:29

Par rapport au code de Nimzo78, c'est en effet pratique d'avoir l'année. -> Merci je vais m'en servir.
Par contre, avec le code que tu donnes, GetWeekDay n'a pas l'air défini.

Personnellement j'ai donc défini comme ça :

public int GetWeekDay(DateTime DateRef)
{int weekDay = (int) DateRef.DayOfWeek;
return (weekDay == 0)? 7 : weekDay;  // Compensate for the fact that DayOfWeek use sunday as the first day of the week
}

J'ai testé dans les cas spéciaux, ça à l'air de bien vérifier la norme ISO 8601.

Commentaire de nimzo78 le 02/11/2006 20:53:48

En effet, j'avais oublié de donner la fonction GetWeekDay().

Celle que tu as définit est bonne et correpond à la mienne :

/// <summary>
/// Retourne le jour de la semaine correspondant au DateTime
/// </summary>
/// <param name="DateToEvaluate">date en question</param>
/// <returns>lundi = 1, Mardi = 2, Mercredi = 3, ..., Dimanche = 7</returns>
private int GetWeekDay(DateTime DateToEvaluate)
{
return ((int)DateToEvaluate.DayOfWeek + 6) % 7 + 1;
}

Merci Flysun d'avoir relevé que l'année pouvait servir aussi.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Question DateTime [ par Spidard ] Bonjour. J'aimerais savoir comment cr&#233;er un objet DateTime, ou m&#234;me String, peut importe du moment qu'il "ressemble" &#224; une date a parti Etat ou requête ayant pour regroupement les numéros de semaine [ par vyzouille ] Bonsoir,Je suis une quiche sur Access (2003) et je dois faire un regroupement par le numéro de la semaine...En fait, j'aurais aimé que les utilisateur Numéro de semaine ... [ par global1 ] Bonjour, je voudrais conna&#238;tre la fonction pour afficher le num&#233;ro de semaine &#224; partir de la date courante en UTC : J'ai essay&#233; Utiliser le résultat d'une procédure stockée. [ par spottydj ] Bonjour, Sous SQL Server 2000, j'ai cr&#233;&#233; une proc&#233;dure stock&#233;e, que voici.CREATE PROCEDURE calculPrixSemaine (@annee int, @numSema Récupérer les jours pair et impair dans une année [ par Fengalt ] Hello, Je cherche une solution pour récupérer les lundis d'une semaine paire et les mardis d'une semaine impaire. Une fois trouvé, tout part dans une Connaitre le numéro de la ligne sélectionnée (Datagridview / Dataset) [ par alexbesn ] Bonjour.J'ai un DataGridview que je remplis avec mon Dataset. Ce que je cherche c'est supprimer la ligne que l'utilisateur va sélectionner dans le dat Numéro de série d'une compact flash [ par aymeric08 ] BonjourEst-il possible de récupérer le numéro de série d'une compact flash ?D'avance merci. [Bug] Activité sur CSharpFr [ par buno ] Bien le bonjour! De temps en temps, il m'arrive d'aller consulter le Top des Membres afin de voir les activités de la semaine sur les sites que je fr Incrémentation automatique [ par thorgal1612 ] Bonjour,J'ai une form ma&#238;tre/d&#233;tail avec une textbox&nbsp; num&#233;ro de facture&nbsp;qui est "binder" avec une tableadapater.Comment faire [C#][CF 1.1] Comment connaitre un numéro de ligne de fichier et y retourner ? [ par foolsky ] Voila je vais lire un texte ligne par ligne j'ais créé une variable qui compte les ligne et qui s'incrémente donc a chaque ligne. Mais existe-t-il une


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales