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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| /****************************************************************************************************************
BUT: Décoder une date en séparant l'année, le mois et le jour.
La fonction DecodeDate n'est pas directement compatible Interbase/Firebird!
La présente fonction est extraite des sources de Delphi et traduite en C
CE: Date = Valeur Date
--
CS: (unsigned short) Year = année, Month = mois et Day = jour
--
*/
void InternalDecodeDate( int Date, struct tm *Times )
{
int D1 = 365;
int D4 = D1 * 4 + 1;
int D100 = D4 * 25 - 1;
int D400 = D100 * 4 + 1;
int Y, M, I;
div_t X;
int (*DayTable)[12];
int MonthDays[2][12] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
//pas de date, alors tout à 0
if( !Date )
{
Times->tm_year = 0;
Times->tm_mon = 0;
Times->tm_mday = 0;
return;
}
//convertion de la date Interbase/Firebird (base 01/01/100) sur la base du 01/01/0001
Date += DeltaDate;
Y = 1;
while( Date >= D400 )
{
Date -= D400;
Y += 400;
};
X = div( Date, D100 );
if( X.quot == 4 )
{
X.quot--;
X.rem += D100;
}
Y += X.quot * 100;
X = div( X.rem, D4 );
Y += X.quot * 4 ;
X = div( X.rem, D1 );
if( X.quot == 4 )
{
X.quot--;
X.rem += D1;
}
Y += X.quot;
M = 1;
//isole la table des nombres de jours en fonction de l'année bissextile
DayTable = &MonthDays[ ( Y % 4 == 0 ) && ( ( Y % 100 != 0 ) || ( Y % 400 == 0 ) ) ];
while( 1 )
{
I = (*DayTable)[M - 1];
if( X.rem < I )
break;
X.rem -= I;
M++;
}
//résultat de la convertion
Times->tm_year = Y;
Times->tm_mon = M;
Times->tm_mday = X.rem + 1;
} |
Partager