Addition date + jours en C

lisatapa Messages postés 3 Date d'inscription jeudi 18 décembre 2003 Statut Membre Dernière intervention 28 mars 2006 - 28 mars 2006 à 22:02
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 28 mars 2006 à 23:52
Bonjour,



Quelqu'un sait si c possible en C à partir d'une date d'entrée et le
nombre de jours qu'on l'on souhaite ajouter, calculer la date de
retour.



Je l'ai vu en C++ mais pas en C. je sais qu'il faudrait gérer les
années bissextiles, les jours fériés
etc... Bref je suis débutante et ça fait plusieurs jours que je barbote
avec les fonctions de time.h : srftime, mktime, difftime sans vraiment
pouvoir construire un code cohérent.



merci pour vos réponses nombreuses et bonne soirée :)
A voir également:

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 mars 2006 à 22:28
Jours fériés ???

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
lisatapa Messages postés 3 Date d'inscription jeudi 18 décembre 2003 Statut Membre Dernière intervention 28 mars 2006
28 mars 2006 à 22:46
pourquoi une réponse comme ça non constructive...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 mars 2006 à 22:58
#define ERR_DATE 0x80000000

const int MonthDaysNbr[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};

int __stdcall bDat2OleInt(DWORD Day, DWORD Month, DWORD Year) /* RETOURNE ERR_DATE SI ERREUR */
{
int bLeapYear, nDaysInMonth, ival;
ival = ERR_DATE;
if(Year < 100 || Year > 9999 || Month < 1 || Month > 12 || Day < 1) {
goto tointEXIT;
} bLeapYear ((Year & 3) 0) && ((Year % 100) != 0 || (Year % 400) == 0);
nDaysInMonth = MonthDaysNbr[Month] - MonthDaysNbr[Month-1] + ((bLeapYear && Day 29 && Month 2) ? 1 : 0);
if(Day > nDaysInMonth) goto tointEXIT;
ival = Year*365L + Year/4 - Year/100 + Year/400 + MonthDaysNbr[Month-1] + Day;
if(Month <= 2 && bLeapYear) --ival; ival -693959L; // DECALE RAPPORT 30/12/1899 0
tointEXIT: return ival;
}

On transforme en int une date ainsi on peut ajouter ou retirer nbr de jours qu'on veut.

Faire ensuite fonction dans l'autre sens.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 mars 2006 à 23:33
l'autre sens:

#define MIN_DATE (-657434L) /* 1/1/100 */
#define MAX_DATE 2958465L /* 31/12/9999 */

// return != 0 si erreur
int __stdcall OleInt2Date(int idat, DWORD *pDay, DWORD *pMonth, DWORD *pYear)
{
long nDaysAbsolute;
long n400Years;
long n400Century;
long n4Years;
long n4Day;
long n4Yr;
int bLeap4 = 1;
if(idat > MAX_DATE || idat < MIN_DATE) return 1;
nDaysAbsolute = idat + 693959L;
n400Years = (long)(nDaysAbsolute / 146097L);
nDaysAbsolute %= 146097L;
n400Years *= 400;
n400Century = (long)((nDaysAbsolute - 1) / 36524L);
if(!n400Century) goto n400CenturyZERO;
nDaysAbsolute = (nDaysAbsolute - 1) % 36524L;
n400Years += (n400Century * 100);
n4Years = (long)((nDaysAbsolute + 1) / 1461L);
if(!n4Years) goto n4yearsZERO;
n4Day = (long)((nDaysAbsolute + 1) % 1461L);
goto bleap4TEST;
n4yearsZERO: bLeap4 0; n4Day (long)nDaysAbsolute;
goto bleap4TEST;
n400CenturyZERO:
n4Years = (long)(nDaysAbsolute / 1461L);
n4Day = (long)(nDaysAbsolute % 1461L);
bleap4TEST:
n400Years += (n4Years << 2);
if(!bLeap4) goto bleap4ZERO;
n4Yr = (n4Day - 1) / 365;
if(!n4Yr) goto goANNEE;
n4Day = (n4Day - 1) % 365;
goto goANNEE;
bleap4ZERO:
n4Yr = n4Day / 365; n4Day %= 365;
goANNEE:
*pYear = (WORD) (n400Years + n4Yr);
if(n4Yr) goto n4dayINCR;
if(!bLeap4) goto n4dayINCR;
if(n4Day < 59) goto n4dayINCR;
if(n4Day > 59) goto forN4YR;
*pMonth = 2;
*pDay = 29;
goto todatEXIT;
n4dayINCR:
++n4Day;
forN4YR:
for(n4Yr = (n4Day >> 5) + 1; n4Day > MonthDaysNbr[n4Yr]; n4Yr++);
*pMonth = (WORD) n4Yr;
*pDay = (WORD) (n4Day - MonthDaysNbr[n4Yr-1]);
todatEXIT:
return 0;
}

Je ne me suis pas encore foulé un neurone sur ce coup, c'est tout droit issu de MFC.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lisatapa Messages postés 3 Date d'inscription jeudi 18 décembre 2003 Statut Membre Dernière intervention 28 mars 2006
28 mars 2006 à 23:47
désolé mais je ne savais pas du tout ce que c'était MFC, maintenant je sais :)

Après je ne sais pas si je comprendrais tout à ce qui est marqué mais
je regarderai ça en détail et je viendrai vous poser des questions s'il
ya des choses floues.



Merci encore...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 mars 2006 à 23:52
oh là, c'est "ISSU DE" mais MFC ne ressemble pas du tout à ça, c'est une énorme encapsulation de l'API Windows sous forme de classes C++.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
Rejoignez-nous