Many times I need to compute differences between two dates, I built a library to do this, here it is the source code.
#include <stdio.h>
#include <stdlib.h>
/* Date structure.
year shall be > -4000
month shall be > 0 and < 13
day shall be > 0 and < 31
*/
typedef struct Data
{
long year;
long month;
long day;
} Date_t;
int checkDate(Date_t date);
long getDay(Date_t date);
long diffDays(Date_t begin, Date_t end);
long diffWeeks(Date_t begin, Date_t end);
/* getDay computes how many days "date" is far from 4000 b.C.*/
long getDay(Date_t date)
{
long a, b, past_days;
if(date.month < 3)
{
date.year -= 1;
date.month += 12;
}
a = (long) (date.year / 100);
b = 2 – a + ( (long) (a / 4));
past_days = (long) (365.25*(date.year + 4716)) + (30.6001*(date.month + 1)) + date.day + b – 1524;
return (past_days);
}
/* diffDays computes how many days begin date is far from end date*/
long diffDays(Date_t begin, Date_t end)
{
long b, e;
if(checkDate(begin)==-1)
{
return(-1);
}
if(checkDate(end)==-1)
{
return(-1);
}
e = getDay(end);
b = getDay(begin);
return(abs(e–b));
}
/* diffWeeks computes how many weeks begin date is far from end date*/
long diffWeeks(Date_t begin, Date_t end)
{
long b, e;
long result;
if(checkDate(begin)==-1)
{
return(-1);
}
if(checkDate(end)==-1)
{
return(-1);
}
e = getDay(end);
b = getDay(begin);
result = result/7;
if((e–b)%7>0)
result++;
return(result);
}
/* getDay checks the congruency of date */
int checkDate(Date_t date)
{
if(date.year<-4000)
{
return(-1);
}
if(date.month<1 || date.month>12)
{
return(-1);
}
if(date.day<1 || date.day>31)
{
return(-1);
}
if(date.month==2)
{
if(date.year%4==0)
{
if(date.year%100==0 && date.year%400!=0)
{
if(date.day>28)
return(-1);
/* the 29th doesn't exist */
}
else
{
if(date.day>29)
return(-1);
/* the 29th exists */
}
}
else
{
if(date.day>28)
{
return(-1);
}
}
return(0);
}
switch(date.month)
{
case 4: /* April */
case 6: /* June */
case 9: /* September */
case 11: /* November */
if(date.day>30)
{
return(-1);
}
else
return(0);
break;
default:
return(0);
break;
}
}