IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Trouver la date via numéro de semaine


Sujet :

C#

  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut Trouver la date via numéro de semaine
    Salut à toutes (et à tous),

    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.Globalization.Calendar calendrier = CultureInfo.InvariantCulture.Calendar;
    int MaSuperSemaine = Calendrier.GetWeekOfYear(MaSuperDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    me permet de récupérer le numéro de semaine de MaSuperDate;
    c'est super comme fonction, mais il me faut la fonction inverse.
    j'aimerais maintenant retrouver les dates du lundi au dimanche de la semaine (au pif) 24 de cette année...

    quelqu'un saurait comment faire ? (sans regarder le calendrier bande de tricheurs !)

    allé, seul le lundi m'intéresse (avec des calculs super complexes je retrouverais les autres dates)

    Merci beau cou !

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Amusant.

    Quelque chose comme cela : (non testé, tappé à la volée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     System.Globalization.Calendar calendar = new System.Globalization.GregorianCalendar();
    int searchedWeek = 10; // N° de semaien à rechercher
    DateTime dtFirstDayFirstWeek = DateTime.MinValue; // pour éviter erreur de compil
    for (int iWeek = 0,  iDay = 1; iWeek != 1; iDay++ )
    {
        dtFirstDayFirstWeek = new DateTime(DateTime.Now.Year, 1, iDay);
        iWeek = calendar.GetWeekOfYear(dtFirstDayFirstWeek, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }
    DateTime firstDayOfGivenWeek = calendar.AddWeeks(dtFirstDayFirstWeek, searchedWeek - 1);
    En gros, tu trouves la date du premier jour de la premiere semaine, et tu ajoute le numéro effectif de la semaine que tu cherches -1.

    EDIT : testé et fonctionne.
    EDIT2 : AddDays remplacé par AddWeeks suite à la correction publiée par SehnSucht.

  3. #3
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    Exercice intéressant, bien que la solution de Bluedeep fonctionne, je donne tout de même ma solution, on sait jamais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //ne pas oublier le using System.Globalization;
    //weekNumber: n° de semaine recherché
    Calendar gregorian = new GregorianCalendar();
    DateTime firstDayYear = new DateTime(DateTime.Now.Year, 1, 1);
    int diff = (int)DayOfWeek.Monday - (int)firstDayYear.DayOfWeek;
    DateTime closestMonday = firstDayYear.AddDays(diff);
     
    return gregorian.AddWeeks(closestMonday, weekNumber);
    On récupère le premier jour de l'année, auquel on ajoute/retire l'écart entre le jour que ça tombe et le jour souhaité (ici un lundi) et on ajoute le nombre de semaines.

    Cordialement !

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour,

    Citation Envoyé par Sehnsucht Voir le message
    On récupère le premier jour de l'année, auquel on ajoute/retire l'écart entre le jour que ça tombe et le jour souhaité (ici un lundi) et on ajoute le nombre de semaines.

    Cordialement !
    Ta solution est indéniablement plus compacte que la mienne

    Néanmoins, elle souffre, sauf erreur de ma part, d'un défaut dans la détermination de la date de début de la première semaine.

    En effet, tu sembles considérer que la première semaine est celle qui contient le 1/1. Malheureusement d'une part (si on en juge par l'exemple posté par le PO), ce n'est pas l'option choisie par le PO, et de plus, dans ma solution j'ai voulu conserver l'aspect paramétrable de la détermination de la première semaine (via l'enum CalendarWeekRule).

    Exemple concret avec ton calcul: si le 1/1 tombe un dimanche, tu vas considérer que la première semaine démarre le 26/12, ce qui n'est pas correct.

    Sinon, bien vu le AddWeeks , je ne me rappelais tout simplement plus de l'existence de cette méthode (auquel cas mon code gagne à être modifié sur sa dernière instruction - le AddDays pouvant avantageusement être remplacé).

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Et pour finir, la solution avec une classe d'extension à Calendar, ce qui est quand même plus maniable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    using System.Globalization;
    public static class CalendarExtension
    {
        public static DateTime GetFirstDayDateOfFirstWeek(this Calendar calendar, 
                                                CalendarWeekRule weekRule, 
                                                DayOfWeek dayOfWeek,
                                                int year)
        {
            DateTime dtFirstDayFirstWeek = DateTime.MinValue;
            for (int iWeek = 0, iDay = 1; iWeek != 1; iDay++)
            {
                dtFirstDayFirstWeek = new DateTime(year, 1, iDay);
                iWeek = calendar.GetWeekOfYear(dtFirstDayFirstWeek, weekRule, dayOfWeek);
                DayOfWeek d;
            }
            return dtFirstDayFirstWeek;
        }
     
        public static DateTime GetFirstDayDateOfWeek(this Calendar calendar,
                                                CalendarWeekRule weekRule,
                                                DayOfWeek dayOfWeek,
                                                int iWeek,
                                                int year)
        {
            if (iWeek <= 0)
            {
                throw new ArgumentOutOfRangeException("Week ne peut pas être <= 0");
            }
            DateTime dtFirstDayFirstWeek = GetFirstDayDateOfFirstWeek(calendar, weekRule, dayOfWeek, year);
            return calendar.AddWeeks(dtFirstDayFirstWeek, iWeek - 1);
        }
    }
    Test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
               Calendar calendar = new GregorianCalendar();
            DateTime firstDayOfGivenWeek = calendar.GetFirstDayDateOfWeek(CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday, 10, 2011);

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    Merci pour votre aide à tous les deux,
    je me suis inspiré de vos solutions pour créer ma classe dont voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Globalization;
     
    namespace Outils
    {
        public class Outils_Dates
        {
            public static List<DateTime> Recup_Dates_Par_NumSemaine(int numSemaine, int Annee)
            {
                if ((numSemaine <= 0) || (numSemaine > 53))
                    throw new ArgumentOutOfRangeException("numSemaine",numSemaine ,"Numéro de semaine incorrect !");
     
                //-1 car on partira de la semaine 1 (et non de la semaine zéro ...)
                int ecartJoursSemaineDesiree = 7 * (numSemaine - 1);
                List<DateTime> mesDates = new List<DateTime>();
                Calendar monCalendrier = new GregorianCalendar();
                DateTime datePremierJourAnnee = new DateTime(Annee, 1, 1);
                DateTime datePremierJourPremiereSemaineAnnee = DateTime.MinValue;
                DateTime datePremierJourSemaineDesiree = DateTime.MinValue;
     
                //je vais tester les 6 jours autour du nouvel an
                //ben ouai, la règle étant que c'est la première semaine comptant au moins 4 jours dans la nouvelle année            
                //donc... le premier Lundi peut être à nouvel an +- 3 jours
                //donc entre le 29/12/annee-1 et le 4/1/annee inclus
                for (int cpt = -3; cpt<=3; cpt++)
                {
                    datePremierJourPremiereSemaineAnnee = datePremierJourAnnee.AddDays(cpt);
     
                    //je récupère le numéro de semaine de la date obtenue
                    int premiereSemaineAnnee = monCalendrier.GetWeekOfYear(datePremierJourPremiereSemaineAnnee, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
     
                    //si le numéro est <> 1 c'est encore l'année précédente
                    //si le numéro est 1 je sors de la boucle avec mon lundi :)
                    if (premiereSemaineAnnee == 1)
                        break;
                }
     
                //j'ajoute l'écart à ce premier lundi pour trouver MON lundi
                datePremierJourSemaineDesiree = datePremierJourPremiereSemaineAnnee.AddDays(ecartJoursSemaineDesiree);
     
                //ajout de dernière minute : si ce lundi est la premier semaine de l'année prochaine c'est pas bon !
                if ((datePremierJourSemaineDesiree.Year > Annee) && (monCalendrier.GetWeekOfYear(datePremierJourPremiereSemaineAnnee, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday) == 1))
                    throw new ArgumentOutOfRangeException("numSemaine", numSemaine, "Ce numéro de semaine n'existe pas pour cette année !");
     
                //puis j'ajoute les 7 jours de cette semaine à mon tableau
                for (int cpt = 0; cpt < 7; cpt++)
                    mesDates.Add(datePremierJourSemaineDesiree.AddDays(cpt));
     
                return mesDates;
            }
        }
    }
    - en effet, le premier lundi peut tout à fait être le 29 décembre de l'année précédente, ce qui pouvait poser problème.
    - la fonction AddWeeks n'existe pas dans VS2005 :/

  7. #7
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Bonjour,



    Ta solution est indéniablement plus compacte que la mienne

    Néanmoins, elle souffre, sauf erreur de ma part, d'un défaut dans la détermination de la date de début de la première semaine.

    En effet, tu sembles considérer que la première semaine est celle qui contient le 1/1. Malheureusement d'une part (si on en juge par l'exemple posté par le PO), ce n'est pas l'option choisie par le PO, et de plus, dans ma solution j'ai voulu conserver l'aspect paramétrable de la détermination de la première semaine (via l'enum CalendarWeekRule).

    Exemple concret avec ton calcul: si le 1/1 tombe un dimanche, tu vas considérer que la première semaine démarre le 26/12, ce qui n'est pas correct.

    Sinon, bien vu le AddWeeks , je ne me rappelais tout simplement plus de l'existence de cette méthode (auquel cas mon code gagne à être modifié sur sa dernière instruction - le AddDays pouvant avantageusement être remplacé).
    Je peux également faire erreur, mais il me semble que justement ça colle juste :
    Si le 1/1 est un dimanche alors (int)DayOfWeek.Monday - (int)firstDayYear.DayOfWeek vaudra 1 et donc firstDayYear.AddDays(diff) me reportera au 2/1 pas au 26/12.

    Quant aux autres cas où je me ramène au lundi de l'année précédente, c'est compensé dans mon utilisation de AddWeeks, tu l'utilises toujours avec un "offset" de -1 alors que je l'utilise sans changement.

    Après j'avoue ne pas avoir poussé les tests très loin, et que ça manquait clairement de modularité.

    @Themacleod1980 :
    Tu devrais vérifier pour la méthode AddWeeks, d'après sa documentation MSDN cette méthode semble exister depuis la toute première version du framework
    Version Information
    .NET Framework
    Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0
    Cordialement !

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Je peux également faire erreur, mais il me semble que justement ça colle juste :
    Si le 1/1 est un dimanche alors (int)DayOfWeek.Monday - (int)firstDayYear.DayOfWeek vaudra 1
    Tu as raison sur cas précis, j'étais parti dans l'idée MonDay = 0 or c'est Sunday = 0.
    Donc ce cas est juste, MAIS j'en prends un autre.

    Si le 1/1 tombe un samedi (6), on a le début de la première semaine qui tombera le 01/01 - 5 jours, soit le 27/12.

    Mon exemple était mauvais (je n'avais pas été voir la définition de l'enum ), mais mon raisonnement est correct.

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    Arf,
    effectivement le AddWeeks existe bel et bien, j'avais mal lu ton code et cherchais le AddWeeks comme étant une méthode de DateTime et non de Calendar

    et pour le problème des numéros de jour...
    sont quand même bizarres ces américains...
    ils sont hyper croyants (oui, je généralise ^^) ils savent que Dieu s'est reposé le 7ème jour (Dimanche) et placent ce jour en position 0...
    la logique pas logique c'est vraiment ... pas logique !

  10. #10
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Citation Envoyé par Themacleod1980 Voir le message
    sont quand même bizarres ces américains...
    ils sont hyper croyants (oui, je généralise ^^) ils savent que Dieu s'est reposé le 7ème jour (Dimanche) et placent ce jour en position 0...
    la logique pas logique c'est vraiment ... pas logique !
    En fait ça vient du calendrier Hébraïque : ou yhvh s'est reposé le 7ème jour : le jour du Sabbat = SAMEDI... ce sont les chrétiens qui ont changé le jour du seigneur pour s'adpater au calendrier romain...

    Désolé pour cet aparté, qui ne répond pas à la question. Mais la réponse est déjà donnée... Il ne manquait qu'une explication au pourquoi Dimanche est le premier jour...

  11. #11
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DateTime GetFirstDayOfWeek(int week, int year)
    {
    	if(week<1 || week>53)
    		throw new ArgumentOutOfRangeException();
     
    	var date = new DateTime(year, 1, 1);
    	date = date.AddDays(7 * (week - 1)).AddDays((int)date.DayOfWeek <= (int)DayOfWeek.Thursday ? -(int)DayOfWeek.Thursday : 0);
    	if (date.DayOfWeek != DayOfWeek.Monday)
    		date = Enumerable.Range(1, 7).Select(i => date.AddDays(i)).First(d => d.DayOfWeek == DayOfWeek.Monday);
    	return date;
    }
    Testé de 2000 à 2011

  12. #12
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bon j'allais écrire je sais plus quoi et puis j'ai voulu faire un test, et finalement je me demande si ça fonctionne bien, ou si c'est moi qui manque de sommeil et qui écrit n'importe quoi, j'ai voulu tester ta classe d'extension et mon code pour comparer les résultats, en vérifiant de 1900 à 2011.

    Mon code à tendance à avoir "potentiellement" une semaine en trop (et encore j'en suis pas certain) le point positif c'est que j'ai toujours un lundi.
    Ton code à "potentiellement" la bonne semaine, mais il ne se fixe pas toujours sur un lundi.

    Bref je mets directement le lien ça ira plus vite http://ideone.com/KEdtB

  13. #13
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    Super ce site Sehnsucht, je ne connaissais pas.
    Faut maintenant tester avec mon code et celui de Nathanael ^^

    point négatif pour Nathanael : ton code me file mal au crane ! (mais merci quand même )
    et puis les instructions Linq n'existent pas dans vs2005 (j'y suis condamné )

    kheironn : Merci pour ce cours de théologie ^^ me coucherais moins stupide ce soir !

  14. #14
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Themacleod1980 Voir le message
    point négatif pour Nathanael : ton code me file mal au crane ! (mais merci quand même )
    et puis les instructions Linq n'existent pas dans vs2005 (j'y suis condamné )
    Roh! Tout de suite...

    Et ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DateTime GetFirstDayOfWeek(int week, int year)
    {
    	if(week<1 || week>53)
    		throw new ArgumentOutOfRangeException();
     
    	var date = new DateTime(year, 1, 1);
    	date = date.AddDays(7 * (week - 1)).AddDays((int)date.DayOfWeek <= (int)DayOfWeek.Thursday ? -(int)DayOfWeek.Thursday : 0);
    	while(date.DayOfWeek != DayOfWeek.Monday)
    		date = date.AddDays(1);
    	return date;
    }
    En plus, il est plus simple

  15. #15
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Bon allez c'est jour de fête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DateTime GetFirstDayOfWeek(int week, int year)
    {
    	if(week<1 || week>53)
    		throw new ArgumentOutOfRangeException();
     
    	var date = new DateTime(year, 1, 1);
    	date = date.AddDays(((((int)date.DayOfWeek) + 6) % 7 < (int)DayOfWeek.Thursday
    				? (-1 * (((int)date.DayOfWeek) + 6) % 7)
    				: (7 - (((int)date.DayOfWeek) + 6) % 7)))
    				.AddDays(7 * (week - 1));
     
    	return date;
    }

  16. #16
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    ok, ben si c'est comme ca je vais me faire un fichier Excel avec des colonnes jour / mois / année / num semaine que la secrétaire remplira à la main en copiant le calendrier des 10 prochaines années.
    et créer une connexion ODBC pour taper dessus !
    ensuite je balayerais TOUTES les lignes pour trouver la première occurrence du num de semaine correspondante
    tout ça à partir d'un site distant en bas débit...

    vous l'avez bien cherché !

    ok je sors

  17. #17
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    week<1 || week>53
    ?
    Euh, y'a pas 52 semaines dans une année ?

    Ah oui, 52 semaines entières... et quelques jours.
    Donc, si je comprends bien, tu débordes sur l'année d'après ?

  18. #18
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    @kheironn

    365 / 7 = 52.14285 semaines
    MAIS, imaginons que le premier lundi de l'année soit le 29 décembre de l'année précédente, nous avons
    365 + 3 jours = 368 jours
    368 / 7 = 52.57142
    hé ben 0.57142 correspond (comme de par hasard) à 4 jours.
    or, il faut 4 jours d'une même semaine dans une même année pour considérer que cette semaine fait partie de cette année : les 4 derniers jours de cette année feront donc partie de la semaine 53 (et non de la première semaine de l'année suivante)

    c'est un cas rare mais à prendre en compte

  19. #19
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par kheironn Voir le message
    ?
    Euh, y'a pas 52 semaines dans une année ?

    Ah oui, 52 semaines entières... et quelques jours.
    Donc, si je comprends bien, tu débordes sur l'année d'après ?
    Si tu prends 2009, S1 a commencé le 29/12/2008 et S53 a commencé le 28/12/2009

  20. #20
    Membre éprouvé Avatar de swif79
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut
    Aller j'en tente une

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private DateTime FirstDateOfWeek(int year, int week, bool firstWeekInSameYear)
            {
                if (week < 1 || week > 53)
                    throw new ArgumentOutOfRangeException();
     
                DateTime firstDayOfYear = new DateTime(year, 1, 1);
                DateTime firstMonday = firstDayOfYear.AddDays(DayOfWeek.Monday - firstDayOfYear.DayOfWeek);
                return firstMonday.AddDays((firstWeekInSameYear ? (firstMonday.Year == year ? week - 1 : week) : week - 1) * 7); 
            }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Crystal] transformation d'une date en numéro de semaine
    Par barna dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 24/03/2017, 09h41
  2. [XL-2007] Créer un graphique avec deux axes des abscisses liés (date et numéro de semaine)
    Par LawNasK dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/05/2015, 10h27
  3. [MySQL-5.5] Peut-on encoder des champs date en numéros de semaines?
    Par creation159 dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/08/2013, 22h07
  4. [AC-2003] Convertir une date en numéro de semaine
    Par sniper2002 dans le forum Access
    Réponses: 16
    Dernier message: 25/07/2010, 20h52
  5. [MySQL] Date et numéro de semaine
    Par Devilju69 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/06/2009, 14h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo