Calcul du numéro de semaine

Soyez le premier à donner votre avis sur cette source.

Snippet vu 42 566 fois - Téléchargée 29 fois

Contenu du snippet

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 / Exemple :


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 ;
		}

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
1 avril 2011

Bonjour à tous,

j'effectue une calcul de sémaine, j'ai remarqué quelque résultats suivants:
19801229 num sém=1
19801230 num sém=1
19801231 num sém=1

Que devrais-je faire pour que ce numéro positionne à 53 pas à 1?
Merci de votre aide.
Messages postés
30
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
16 avril 2010

Merci pour cette très bonne fonction

''' <summary>
''' Retourne la semaine et l'année d'une date
''' </summary>
''' la date de reference

''' REFERENCE : retourne le numero de la semaine

''' REFERENCE : retourne l' annee en rapport à la semaine

Private Sub GetWeekAndYear(ByVal DateRef As DateTime, ByRef NumWeek As Integer, ByRef Year As Integer)
'Nbr de jour minimum pour faire une semaine
Dim MinDayForWeekOk As Integer = 4
' Semaine calendaire, à modifier le cas-échéant
Dim WeekDayAfterDec As Integer = Me.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 - CInt(Convert.ToInt16((WeekDayAfterDec - DateRef.Day >= (8 - MinDayForWeekOk)) AndAlso (DateRef.Month = 1))) + CInt(Convert.ToInt16((DateRef.Month = 12) AndAlso (DateRef.Day - WeekDayAfterDec >= (24 + MinDayForWeekOk))))

'premier jour de l'année
Dim FirstDayYear As New DateTime(Year, 1, 1)

'numéro du premier jour de l'année
Dim WeekDayFirstDayYear As Integer = Me.GetWeekDay(FirstDayYear)

'no de semaine
NumWeek = DateRef.Subtract(FirstDayYear.AddDays(WeekDayAfterDec - WeekDayFirstDayYear)).Days / 7 + CInt(Convert.ToInt16(WeekDayFirstDayYear < (9 - MinDayForWeekOk)))
End Sub

''' <summary>
''' Retourne le jour de la semaine correspondant au DateTime
''' </summary>
''' date en question
''' <returns>lundi 1, Mardi 2, Mercredi = 3, ..., Dimanche = 7</returns>
Private Function GetWeekDay(ByVal DateToEvaluate As DateTime) As Integer
Return (CInt(DateToEvaluate.DayOfWeek) + 6) Mod 7 + 1
End Function
Messages postés
5
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
2 novembre 2006

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>
/// date en question


/// <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.
Messages postés
1
Date d'inscription
jeudi 2 juin 2005
Statut
Membre
Dernière intervention
16 août 2006

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.
Afficher les 22 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.