Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Bibliothèques, systèmes et outils
Bibliothèques, systèmes et outils Forum d'entraide sur les bibliothèques, la programmation système et les outils en C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/10/2012, 10h51   #1
frglyon
Invité de passage
 
Inscription : mars 2005
Messages : 19
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 19
Points : 4
Points : 4
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.
frglyon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2012, 11h22   #2
autre mickael
Nouveau Membre du Club
 
Inscription : octobre 2010
Messages : 56
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 56
Points : 38
Points : 38
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 ?
autre mickael est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/10/2012, 11h33   #3
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 071
Points : 11 071
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().
Obsidian est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2012, 18h44   #4
frglyon
Invité de passage
 
Inscription : mars 2005
Messages : 19
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 19
Points : 4
Points : 4
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.
frglyon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2012, 11h54   #5
leternel
Expert Confirmé
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 220
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 : 1 220
Points : 2 596
Points : 2 596
à 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.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/10/2012, 20h39   #6
magma²
Membre habitué
 
Inscription : septembre 2007
Messages : 98
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 98
Points : 115
Points : 115
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
magma² est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2012, 15h06   #7
leternel
Expert Confirmé
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 220
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 : 1 220
Points : 2 596
Points : 2 596
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.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h19.


 
 
 
 
Partenaires

Hébergement Web