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, systèmes et outils C Discussion :

Manipulation de dates


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Points : 20
    Points
    20
    Par défaut Manipulation de dates
    Bonjour,
    Je vous prie d'être très indulgent avec ma personne, je débute en C. J'avoue que je n'ai pas balayé (par manque de temps) tout le forum.

    Ma problématique est la suivante : j'ai dans un programme C des dates stockées en int sous le format SSAAMMJJ. Je voudrais pouvoir retirer 1 jour à ma date, donc si j'ai 20121001, j'aimerai obtenir 20120930. Existe-t-il des bibliothèques pour ce type de problème ?

    Merci d'avance,
    Cordialement.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Je suis pas sûr de mon coup car je ressort ça d'un vieux code mais l'idée est de transformer l'entier en struct tm*, de faire les modifications dessus puis de remettre en entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    time_t time_abs = time(NULL);//date actuelle
    struct tm* time_from = localtime(&time_abs);//transformation power rangers
    time_from->tm_mday --;//décrémentation du jour, à tester avec un jour à 0 mais il me semble que c'est bien fait
    time_abs = mktime(time_from);//re-transformation
    EDIT : je n'avais pas vu ton format de date, tu ne peux pas utiliser time_t ?

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Citation Envoyé par autre mickael Voir le message
    EDIT : je n'avais pas vu ton format de date, tu ne peux pas utiliser time_t ?
    Ça reste une bonne idée : personnellement je remplirais la structure à partir de ce que je lis dans la chaîne parce que c'est facile à faire, je transformerais cela en timestamp avec mktime(), je retirerais 86400 secondes (soit 24 heures) pour reconvertirais cela en heure locale avec localtime().

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    Bonjour,
    Je vous remercie de m'avoir répondu et proposé une solution. J'ai cependant écrit un petit algorithme, pour gérer ce retrait d'1 jour à une date quelconque.

    Cordialement.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    à tout hasard, tu ne veux pas nous le donner?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 168
    Points
    168
    Par défaut
    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
     
    #include <stdio.h>
     
    #define J(date) ((date) % 100)        //aaaammJJ
    #define M(date) (((date) / 100) % 100)//aaaaMMjj
    #define A(date) ((date) / 10000)      //AAAAmmjj
     
    int jma2jj(int j, int m, int a)
    { //Conversion j m a en jour julien
      return (1461 * (a + 4800 + (m - 14) / 12)) / 4 + (367 * (m - 2 - 12 * ((m - 14) / 12))) / 12 - (3 * ((a + 4900 + (m - 14) / 12) / 100)) / 4 + j - 32075;
    }
     
    void jj2jma(int n, int *j, int *m, int *a)
    { //Conversion jour julien en j m a
      int t0 = n + 68569;
      int t1 = (4 * t0) / 146097;
      int t2 = t0 - (146097 * t1 + 3) / 4;
      int t3 = (4000 * (t2 + 1)) / 1461001;
      int t4 = t2 - (1461 * t3) / 4 + 31;
      int t5 = (80 * t4) / 2447;
      *j = t4 - (2447 * t5) / 80;
      *m = t5 + 2 - (12 * (t5 / 11));
      *a = 100 * (t1 - 49) + t3 + (t5 / 11);
    }
     
    int calcdate(int date, int n)
    { //Retourne date +- n jours
      int j, m, a;
      jj2jma(jma2jj(J(date), M(date), A(date)) + n, &j, &m, &a);
      return a * 10000 + m * 100 + j;
    }
     
    int main(void)
    {
      int n, date = 20121001; //01/10/2012
     
      for(n = -100000; n; n /= 10)
        printf("%d%-+7d=%d\n", date, n, calcdate(date, n));
     
      for(n = 1; n <= 100000; n *= 10)
        printf("%d%-+7d=%d\n", date, n, calcdate(date, n));
     
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    20121001-100000=17381217
    20121001-10000 =19850516
    20121001-1000  =20100105
    20121001-100   =20120623
    20121001-10    =20120921
    20121001-1     =20120930
    20121001+1     =20121002
    20121001+10    =20121011
    20121001+100   =20130109
    20121001+1000  =20150628
    20121001+10000 =20400217
    20121001+100000=22860717

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Merci bien!
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Manipulations de dates et heures
    Par benj63 dans le forum C++
    Réponses: 5
    Dernier message: 16/12/2004, 15h09
  2. [JDBC] manipulation des dates/heures en Java
    Par kurkLord dans le forum JDBC
    Réponses: 6
    Dernier message: 09/08/2004, 12h49
  3. Manipulations des Dates
    Par kurtc dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/04/2004, 14h39
  4. [IB6][BCB5]Manipulation des dates.
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 09/04/2004, 15h33
  5. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 11h46

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