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

Bibliothèques Discussion :

Utilisation de Date.h (Howard E. Hinnant)


Sujet :

Bibliothèques

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 119
    Points
    119
    Par défaut Utilisation de Date.h (Howard E. Hinnant)
    Bonjour,

    Ci-après un code qui ne fonctionne pas.
    Quelqu'un pourrait-il me dire quelle erreur j'ai pu commettre?
    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
     
    #include <iostream>
    #include <sstream>
    #include "date.h"
    int main(int, char *[])
    {
        string st("12:30:15.50)))"); // L'essai avec . ou , comme séparateur décimal de la seconde ne change rien. La suppression de la partie décimale non plus.
        std::istringstream strs(st);
        bool test = strs.operator bool(); // --> renvoie true dans test
        std::chrono::system_clock::time_point tps;
        date::from_stream(strs,"%T",tps);     // --> met le istream en erreur...
        test = strs.operator bool();  // --> renvoie false dans test
        date::to_stream(std::cout,"%F %T",tps); 
        std::cout << std::endl << "erreur : " << test;
        exit (0);
    }
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1970-01-01 00:00:00.000000000
    erreur : 0
    Sachant que si je remplace l'heure par une date valide et le format par %d/%m/%Y la lecture se passe parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        string st("12/01/2018)))");
        std::istringstream strs(st);
        bool test = strs.operator bool();
        std::chrono::system_clock::time_point tps;
        date::from_stream(strs,"%d/%m/%Y",tps);
        test = strs.operator bool();
        date::to_stream(std::cout,"%F %T",tps);
        std::cout << std::endl << "failbit : " << test;
        exit (0);
    produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    2018-01-12 00:00:00.000000000
    erreur : 1
    J'ai également joué un peu avec les valeurs de l'heure à saisir (autre séparateur décimal, sans décimales ...), remplacé le format par son équivalent (%H%M%S) sans succès.
    Je travaille avec QT Creator 4.7.2 / QT 5.10 / MinGW32 (préinstallé) en mode c++17.
    Par avance merci à tous ceux qui voudront bien m'aider

    A bientôt
    Marc

    P.S. Désolé j'ai massacré le nom de l'auteur. Corrigé.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    En poursuivant mes tests, j'ai repris un debug complet de ma procédure, en entrant dans la lecture.
    Je me suis aperçu que l'heure est lue convenablement, et par la suite un contrôle est effectué sur la date, qui se révèle KO (il constate que la date est mal formée, met le failbit sur le stream et sort sans rien modifier).
    Cela signifie soit que cette bibliothèque n'est pas conçue (explicitement) pour lire une heure toute seule et l'interdit, ce qui me surprend un peu dans la mesure où je n'en ai pas trouvé mention dans sa doc (ici la doc de sa demande d'intégration au standard), et que j'ai lu des articles où l'auteur de la bib discute de manipulations sur l'heure seule (pas de sa lecture cependant), soit que je n'utilise pas le bon type pour tps.
    Je préfère la deuxième hypothèse...
    Quelqu'un saurait-il m'aider?

    Par avance merci
    A bientôt
    Marc

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    J'ai fini par trouver la solution.
    En effet, en explorant plus avant la bibliothèque (intégralement contenue dans un unique .h), j'ai découvert que la fonction to_stream qui effectue la lecture effective était déclinée en plusieurs versions, en fonction du type de données à alimenter entre autres. J'en ai trouvé une qui ne réalisait pas de test sur la date après lecture, et il s'avère qu'elle prend comme cible des types du genre std::chrono::duration. J'ai choisi std::chrono::seconds, et la lecture a réussi.
    Pour en faire un timepoint, il me suffit alors de l'ajouter à un autre timepoint dont l'heure est nulle.
    Problème résolu.
    Merci tout de même à tous ceux qui m'ont lu, même si finalement il n'ont pas eu besoin de m'aider.

    A bientôt
    Marc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL]Trigger avec condition utilisant la date du jour
    Par Irish dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 21/12/2006, 22h17
  2. [MySQL] Utilisation des dates
    Par lampre dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/12/2006, 15h06
  3. Réponses: 2
    Dernier message: 23/05/2006, 16h58
  4. Utilisation de date et time en C
    Par tchoimars dans le forum C
    Réponses: 2
    Dernier message: 27/12/2005, 16h35
  5. utilisation de Date::Manip
    Par ludo0 dans le forum Modules
    Réponses: 2
    Dernier message: 07/10/2004, 13h54

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