cs_plopman
Messages postés67Date d'inscriptiondimanche 29 février 2004StatutMembreDernière intervention13 septembre 2006
-
18 avril 2005 à 17:05
Idriss -
4 févr. 2019 à 14:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
jlcj10
Messages postés1Date d'inscriptionjeudi 30 août 2007StatutMembreDernière intervention 1 avril 2011 1 avril 2011 à 08:50
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.
toopix
Messages postés30Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention16 avril 2010 12 janv. 2011 à 15:06
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
cs_nimzo78
Messages postés5Date d'inscriptiondimanche 26 février 2006StatutMembreDernière intervention 2 novembre 2006 2 nov. 2006 à 20:53
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
Merci Flysun d'avoir relevé que l'année pouvait servir aussi.
flysun
Messages postés1Date d'inscriptionjeudi 2 juin 2005StatutMembreDernière intervention16 août 2006 16 août 2006 à 14:55
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.
cs_nimzo78
Messages postés5Date d'inscriptiondimanche 26 février 2006StatutMembreDernière intervention 2 novembre 2006 27 févr. 2006 à 21:11
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++
spottydj
Messages postés13Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention13 juillet 2008 27 févr. 2006 à 20:53
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
cs_nimzo78
Messages postés5Date d'inscriptiondimanche 26 février 2006StatutMembreDernière intervention 2 novembre 2006 27 févr. 2006 à 19:49
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.
spottydj
Messages postés13Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention13 juillet 2008 27 févr. 2006 à 12:40
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
cs_nimzo78
Messages postés5Date d'inscriptiondimanche 26 février 2006StatutMembreDernière intervention 2 novembre 2006 27 févr. 2006 à 11:45
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 !
cs_nimzo78
Messages postés5Date d'inscriptiondimanche 26 février 2006StatutMembreDernière intervention 2 novembre 2006 26 févr. 2006 à 23:32
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);
spottydj
Messages postés13Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention13 juillet 2008 12 janv. 2006 à 10:11
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);
spottydj
Messages postés13Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention13 juillet 2008 3 janv. 2006 à 20:54
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 ;)
toudilesptits
Messages postés2Date d'inscriptionmercredi 4 août 2004StatutMembreDernière intervention15 décembre 2005 15 déc. 2005 à 08:14
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à.
slaf83
Messages postés2Date d'inscriptionmardi 28 janvier 2003StatutMembreDernière intervention14 décembre 2005 14 déc. 2005 à 13:21
Ce code est parfait !
Les approximations données sont fausses car une norme est une norme !
toudilesptits
Messages postés2Date d'inscriptionmercredi 4 août 2004StatutMembreDernière intervention15 décembre 2005 1 déc. 2005 à 10:17
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.
Horfee
Messages postés188Date d'inscriptionmercredi 9 avril 2003StatutMembreDernière intervention10 août 2009 26 août 2005 à 14:25
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
Mercusyo
Messages postés3Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention 3 février 2012 25 août 2005 à 20:55
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))
@+
cs_gluk
Messages postés43Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention25 avril 2008 26 juil. 2005 à 12:27
lol
Horfee
Messages postés188Date d'inscriptionmercredi 9 avril 2003StatutMembreDernière intervention10 août 2009 26 juil. 2005 à 10:18
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 ?
cs_gluk
Messages postés43Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention25 avril 2008 30 juin 2005 à 17:49
Super code,
merci beaucoup pour ton aide,
@+
cs_plopman
Messages postés67Date d'inscriptiondimanche 29 février 2004StatutMembreDernière intervention13 septembre 2006 18 avril 2005 à 17:05
Je trouve ca assez intéressant ! Bonne continuation.
4 févr. 2019 à 14:47
1 avril 2011 à 08:50
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.
12 janv. 2011 à 15:06
''' <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
2 nov. 2006 à 20:53
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.
16 août 2006 à 14:55
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.
27 févr. 2006 à 21:11
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++
27 févr. 2006 à 20:53
27 févr. 2006 à 19:49
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.
27 févr. 2006 à 12:40
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
27 févr. 2006 à 11:45
"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 !
26 févr. 2006 à 23:32
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)));
}
12 janv. 2006 à 10:11
using System.Globalization;
int week = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now,CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
3 janv. 2006 à 20:54
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 ;)
15 déc. 2005 à 08:14
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à.
14 déc. 2005 à 13:21
Les approximations données sont fausses car une norme est une norme !
1 déc. 2005 à 10:17
n° de semaine=arrondi((date du jour - 01/01/date de l'année en cours)/7 + 0.5)
Merci pour vos avis.
26 août 2005 à 14:25
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
25 août 2005 à 20:55
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))
@+
26 juil. 2005 à 12:27
26 juil. 2005 à 10:18
30 juin 2005 à 17:49
merci beaucoup pour ton aide,
@+
18 avril 2005 à 17:05