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(eb));
}

/* 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 = (abs(eb));
    result = result/7;
    if((eb)%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;
    }
}