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

Contribuez .NET Discussion :

Calculez le nombre d'année, mois et jours entre une date et la date du jour [Sources]


Sujet :

Contribuez .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut Calculez le nombre d'année, mois et jours entre une date et la date du jour
    J'ai trouver pas mal de fonction qui donne le nombre de jour écouler entre deux date mais je n'ai trouver nul part d'algorithme donnant la réponse sous forme JJ MM AA.
    J'apporte donc ma (petite) pierre à l'édifice .

    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
     
    internal static int[] GetDatePassed(DateTime pDate)
            {
                DateTime Date = pDate;
                TimeSpan Tampon = new TimeSpan(1, 0, 0, 0);
                int Day = 0, Month = 0, Year = 0, DataMonth = 0;
     
                while (Date.Date != DateTime.Now.Date)
                {
                    Date += Tampon;
                    DataMonth = Date.Month - 1;
                    if (DataMonth == 0) DataMonth = 12;
                    Day++;
     
                    if (Day >= 28 && DataMonth == 2)
                    {
                        if (Date.Year %4 !=0 || (Date.Year %100 == 0 && Date.Year%400 != 0))
                        {
                            Day = 0; Month++;
                        }
                        if (Day == 29)
                        {
                            Day = 0; Month++;
                        }
                    }
                    else if (Day == 30 && (DataMonth == 4 || DataMonth == 6 || DataMonth == 9 || DataMonth == 11))
                    {
                        Day = 0; Month++;
                    }
                    else if (Day == 31)
                    {
                        Day = 0; Month++;
                    }
     
                    if (Month == 12)
                    {
                        Month = 0; Year++;
                    }
                }
                if (Day == 30 && (DataMonth == 4 || DataMonth == 6 || DataMonth == 9 || DataMonth == 11))
                {
                    Day = 0; Month++;
                }
     
                return new int[] { Day, Month, Year };
            }
    Attention toutefois que je n'ai pas mis de test de garde .
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  2. #2
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    je crois voir une erreur sur le calcul des années bissectiles: par exemple, 1900 est divisible par 4 mais pas bissecticle, car c'est divisible par 100. 1200 est divisible par 4 et divisible par 100 MAIS divisible par 400 donc bissectile. bref, faut améliorer ce bout là.

    Ensuite c'est aussi au niveau des performances que je vois un soucis.
    Tu imagines, si la différence se fait sur plusieurs siècles, le nombre d'itérations que cela fait? c'est énorme. surtout si la méthode est potentiellement utilisée plusieurs fois, par exemple, dans un tableau ou autre.


    Il faudrait comparer au niveau perfs parce que je ne garanti pas que ma solution soit meilleure et elle requiert plus de "tricks" pour gérer parfaitement les choses mais je pense que c'est plus rapide d'utiliser des divisions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DateTime date1 = new DateTime(2000, 2, 18);
    DateTime date2 = new DateTime(2003, 10, 4);
    TimeSpan tspan = date2 - date1;
    double numberofdays = tspan.TotalDays;
    double year = numberofdays / 365;
    et bam j'ai mon nombre d'années. Bien sûr, si year < 4, il faut refaire un calcul pour voir si parmi les trois ans compris dans le range, l'une est bissectile, dans ce cas, il faut enlever 1 jour et refaire le calcul.

    etc etc.
    je pense que ma solution est éventuellement plus rapide pour des gros ranges mais elle nécessite plus de tests et est plus difficile à lire pour l'humain (j'ai pas mis la partie pour les mois et les jours car j'ai juste pondu ca sur un papier).
    La tienne est plus claire mais doit être corrigée pour être parfaitement exacte


    ps: je critique mais dans un but d'amélioration. MERCI pour la contribution, hésite pas à en faire d'autres, elles seront intégrées dans les FAQs et serviront à plein de monde
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par Louis-Guillaume Morand Voir le message
    ps: je critique mais dans un but d'amélioration. MERCI pour la contribution, hésite pas à en faire d'autres, elles seront intégrées dans les FAQs et serviront à plein de monde
    Il n'y a pas de problème, je pars du principe que toutes critiques est bonne à prendre tant qu'elle est constructive .

    Pour le reste, je n'ai pas le temps pour le moment de corriger ça "à chaud" pour le moment mais je reviens dessus sous peu .

    Voila bonne journée à tous.
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Voila j'ai corriger les années bissextiles.

    Effectivement le nombre de boucle risque d'être impressionnante, le programme pour lequel j'ai crée cet algo n'est censé calculé que quelques année (10 ans grand max), si on pense calculer des siècles, il faudra l'améliorer un peu ^^.
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

Discussions similaires

  1. Connaitre la date de la dernière mise à jour d'une table
    Par farenheiit dans le forum Administration
    Réponses: 1
    Dernier message: 28/05/2008, 16h04
  2. Réponses: 5
    Dernier message: 13/05/2008, 15h28
  3. [DATE] Connaitre l'intervalle de jour d'une semaine
    Par dragonfly dans le forum ASP
    Réponses: 6
    Dernier message: 05/10/2007, 22h56
  4. [Dates] Comment obtenir le premier jour d'une semaine ?
    Par damien.vinouze dans le forum Langage
    Réponses: 8
    Dernier message: 09/05/2007, 08h26
  5. Réponses: 3
    Dernier message: 18/10/2005, 15h34

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