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 :

tm_mday > 31 passé dans une struct tm pour mktime : Valide ! Pourquoi ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut tm_mday > 31 passé dans une struct tm pour mktime : Valide ! Pourquoi ?
    Bonjour,

    J'ai une question sur la méthode mktime de <ctime>.

    Voici le code qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        time_t rawTime = 0, time = 0;
        struct tm *t =  localtime (&rawTime);
        t->tm_sec = 0;
        t->tm_min = 0;
        t->tm_hour = 0;
        t->tm_mday = 50;
        t->tm_mon = 11;
        t->tm_year = 100;
        time = mktime(t);
    Normalement time devrait être égal à -1(sur la dernière ligne en rouge) vu que je tente de convertir la date 50ième jour du mois de décembre 2070 :
    If the calendar time cannot be represented, a value of -1 is returned.
    Mais ce n'est pas le cas. Pourquoi ?
    Je n'arrive pas à trouver un semblant de réponses sur le net


    Edit : En faisant des recherches et en utilisant des mots exotiques sur google, j'ai réussi à trouver la réponse à ma question.
    C'est mktime qui ajuste les valeurs de la structure. Par ex le 32 janvier sera compris comme le 1 février..
    Et le 29 février 2013 sera compris comme le 1 mars 2013.....

    Du coup, ça ne m'arrange pas.
    Effectivement, pour vérifier une date :
    * je faisais appel à localtime pour me fournir une struct tm valide
    * je modifiais la struct tm en la remplissant de la date à vérifier
    * je donnais la struct tm à mktime et vérifiais si le retour == -1 pour voir si la date était correcte..
    N'existe-t-il pas une méthode tel que mktime mais qui ne chipote pas lors de la conversion ? Donc qui fait stricto sensu la conversion de la date qu'on lui donne et puis c'est tout.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Si les variables sont ajustées quand elles ne respectent pas les bornes, tu peux peut-être ajouter une comparaison pour détecter l'ajustement en question après l'appel.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    De manière générale, ou bien tu utilises localtime pour te donner une structure complétée avec les valeur adéquates, mais que tu n'utilise que pour récupérer les données qu'elle contient, ou bien, tu crées toi-même la structure en question, à charge pour toi de veiller à ce que les valeurs que tu y indiques soient cohérentes.

    Ceci dit, la vérification de la validité d'une date est particulièrement simple, étant donné qu'elle peut se limiter à deux fonctions :
    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
    bool isBisextile(int annee){
        if( annee % 4){ 
            if(annee % 100){
                if(annee % 400){
                    return true;
                }
                return false;
            }
            return true;
        }
        return false;
    }
    bool isCorrectDate(int day, int month, int year){
        static int numberOfDays[12]={31,0,31,30,31,30,31,31,30,31,30,31};
        if(day <31 || day > 1 )
            return false;
        if(month == 2){
            if(isBissextile(year){
                numberOfDays[1] = 29;
            }
            else{
                numberOfDays[1] = 28;
            }
        }
        return day <= numberOfDays[mounth - 1];
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ceci dit, la vérification de la validité d'une date est particulièrement simple, étant donné qu'elle peut se limiter à deux fonctions :
    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
    bool isBisextile(int annee){
        if( annee % 4){ 
            if(annee % 100){
                if(annee % 400){
                    return true;
                }
                return false;
            }
            return true;
        }
        return false;
    }
    bool isCorrectDate(int day, int month, int year){
        static int numberOfDays[12]={31,0,31,30,31,30,31,31,30,31,30,31};
        if(day <31 || day > 1 )
            return false;
        if(month == 2){
            if(isBissextile(year){
                numberOfDays[1] = 29;
            }
            else{
                numberOfDays[1] = 28;
            }
        }
        return day <= numberOfDays[mounth - 1];
    }
    Quel dommage de devoir réimplémenter la roue...le traitement de dates est un truc si standard et tellement moins simple qu'il n'y paraît...heureusement que ce n'est que la date et non l'heure, car là il y a de quoi s'arrahcer les cheveux.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par therwald Voir le message
    Quel dommage de devoir réimplémenter la roue...le traitement de dates est un truc si standard et tellement moins simple qu'il n'y paraît...heureusement que ce n'est que la date et non l'heure, car là il y a de quoi s'arrahcer les cheveux.
    En effet.

    Mais, à l'heure actuelle, il n'y a encore rien de standard pour la gestion des dates.

    Ceci dit, pour éviter d'avoir à réinventer la roue on peut proposer de passer par boost::date_time.

    Toute la question (plus ou moins théorique) étant de savoir s'il est préférable de se contenter d'implémenter deux fonctions sommes toutes triviales pour éviter une dépendance supplémentaire ou s'il vaut mieux payer le prix de cette dépendance car on manipulera des dates et des heures de manière régulière et plus poussée

    Dans certains cas, l'utilisation de boost::date_time est très largement justifiée, dans d'autres, si le but est de "valider" une date mais qu'il n'y a pas d'autres manipulations à faire, est-ce que cela en vaut réellement la peine Chacun verra midi à sa porte
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut
    Merci pour vos réponses.
    Ce qui m'aurait intéressé c'est une fonction standard..
    Je pense que je vais me contenter de vérifier la date avant de l'envoyer à mktime.

    Bien à vous

Discussions similaires

  1. Mot de passe dans une archive
    Par Jibees dans le forum Linux
    Réponses: 1
    Dernier message: 04/12/2006, 23h08
  2. Réponses: 2
    Dernier message: 22/02/2006, 11h18
  3. Réponses: 2
    Dernier message: 19/01/2006, 21h59
  4. mettre les termes d'un string dans une struct
    Par grand's dans le forum SL & STL
    Réponses: 17
    Dernier message: 29/11/2004, 17h43
  5. sécuriser le mot de passe dans une page asp
    Par Redouane dans le forum ASP
    Réponses: 2
    Dernier message: 10/03/2004, 21h16

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