Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité régulier
    Inscrit en
    mars 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 22
    Points : 6
    Points
    6

    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
    Inscrit en
    octobre 2010
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 56
    Points : 43
    Points
    43

    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 :
    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 470
    Points : 13 985
    Points
    13 985

    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
    Invité régulier
    Inscrit en
    mars 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 22
    Points : 6
    Points
    6

    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 Confirmé Sénior

    Homme Profil pro Pierre
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    2 228
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 2 228
    Points : 5 178
    Points
    5 178

    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.
    • La plus sotte des questions est celle qu'on ne pose pas.

    Pour faire des graphes, essayez yEd.

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    septembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2007
    Messages : 103
    Points : 153
    Points
    153

    Par défaut

    Code :
    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 :
    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 Confirmé Sénior

    Homme Profil pro Pierre
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    2 228
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 2 228
    Points : 5 178
    Points
    5 178

    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.
    • La plus sotte des questions est celle qu'on ne pose pas.

    Pour faire des graphes, essayez yEd.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •