Conviene trasformare le date in julian day. La differenza in giorni la si ottiene sottraendo i due valori:
codice:
#include <stdio.h>
#include <stdlib.h>
typedef struct struttura
{
int g, m, a;
}data;
int IsJulianDate(int year, int month, int day)
{
if ( year > 1582 )
return 0;
if ( month > 10 )
return 0;
if ( day > 4 )
return 0;
return 1;
}
double CalendarDateToJulianDay(const data *dt)
{
double Y, M, D;
double A, B;
B = 0;
D = dt->g;
if ( dt->m <= 2 )
{
Y = dt->a - 1;
M = dt->m + 12;
}
else
{
Y = dt->a;
M = dt->m;
}
if ( !IsJulianDate(dt->a, dt->m, dt->g) )
{
A = (int)(Y/100);
B = 2 - A + (int)(A/4);
}
return ( (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5 );
}
void JulianDayToCalendarDate(double jd, data *dt)
{
double num = jd + 0.5;
int Z = (int)num;
double F = num - Z;
double A, B, C, D, E;
int alpha;
double decimalDays;
if ( Z < 2299161 )
{
A = Z;
}
else
{
alpha = (int)( (Z - 1867216.25) / 36524.25 );
A = Z + 1 + alpha - (int)(alpha / 4);
}
B = A + 1524;
C = (int)( (B - 122.1) / 365.25 );
D = (int)( 365.25 * C );
E = (int)( (B - D) / 30.6001 );
decimalDays = B - D - (int)(30.6001 * E) + F;
dt->g = (int)decimalDays;
if ( E < 14 )
{
dt->m = E - 1;
}
else if ( E == 14 || E == 15 )
{
dt->m = E - 13;
}
if ( dt->m > 2 )
{
dt->a = C - 4716;
}
else if ( dt->m == 1 || dt->m == 2 )
{
dt->a = C - 4715;
}
}
/*
gcc -Wall -Wextra -pedantic -O2 main.c -o prova
*/
int main()
{
data dt1;
data dt2;
data dt3;
double jd1;
double jd2;
double jd3;
int giorni;
dt1.g = 2;
dt1.m = 6;
dt1.a = 1900;
dt2.g = 5;
dt2.m = 1;
dt2.a = 1990;
jd1 = CalendarDateToJulianDay(&dt1);
jd2 = CalendarDateToJulianDay(&dt2);
giorni = (int)(jd2 - jd1);
printf("Data 1: %d/%d/%d\n", dt1.g, dt1.m, dt1.a);
printf("Data 2: %d/%d/%d\n", dt2.g, dt2.m, dt2.a);
printf("\ndifferenza in giorni: %d\n", giorni);
giorni = 89;
jd3 = jd2 + giorni;
JulianDayToCalendarDate(jd3, &dt3);
printf("\n%d/%d/%d + %d giorni = %d/%d/%d\n", dt2.g, dt2.m, dt2.a, giorni, dt3.g, dt3.m, dt3.a);
return EXIT_SUCCESS;
}
Output:
codice:
Data 1: 2/6/1900
Data 2: 5/1/1990
differenza in giorni: 32724
5/1/1990 + 89 giorni = 4/4/1990