# Robson ▸ Little Red Book ▸ Days between dates

## Chapter 2 - Question 7

Given two dates between January 1st, 1901 and December 31st, 1999, calculate the number of days between the dates.

### Solution 1

Unfortunately, Windows doesn't support negative numbers for the PHP date functions, so I can't do this the easy way.

`<?` `    // the number of days per month;` `    \$days_per_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);` ` ` `    // generate a random first day and last day between 1/1/1901 and 31/25/1999` `    \$day_start = array(0, mt_rand(1, 12), mt_rand(1901,1950));` `    \$day_end = array(0, mt_rand(1, 12), mt_rand(1951,1999));` ` ` `    // generate a random number of days for each month` `    \$day_start = mt_rand(1, \$days_per_month[\$day_start-1]);` `    \$day_end = mt_rand(1, \$days_per_month[\$day_end-1]);` `    ` `    // first, work out the number of days elapsed in the first year past the start date` `    // days elapsed in that month` `    // so if the month has 30 days and this is day 7, this will be 23` `    \$days = \$days_per_month[\$day_start-1] - \$day_start;` `    // then add the days for each month after` `    for (\$n = \$day_start; \$n < 12; \$n++)` `        // add the number of days that month` `        \$days += \$days_per_month[\$n];` `        ` `    // if that year was a leap year` `    // check if it's january or (february and before the leap day)` `    if (!(\$day_start % 4) && (\$day_start == 1 || (\$day_start == 2 && \$day_start < 29)))` `        // add the leap day` `        \$days++;` `        ` `    // second, work out the number of days elapsed in the last year` `    // take away one for the current day (the question states 'inbetween')` `    \$days += \$day_end-1;` `    ` `    // loop through each remaining month` `    for (\$n = 0; \$n < \$day_end-1; \$n++)` `        // and add in the days for that month` `        \$days += \$days_per_month[\$n];` `        ` `    // if that year was a leap year` `    // and if the month was after february` `    if (!(\$days_end % 4) && \$day_end > 2)` `        // add the leap day` `        \$days++;` `    ` `    // now loop through all the years inbetween` `    for (\$n = \$day_start+1; \$n < \$day_end; \$n++)` `    {` `        \$days += 365;` `        // check if it was a leap year` `        if (!(\$n % 4))` `            // add the leap day` `            \$days++;` `    }` `    ` `    // output the number of days and the start/end date    ` `    echo 'There are ' . number_format(\$days) . ' days between ' . implode('/', \$day_start) . ' and ' . implode('/', \$day_end);` `?>`

Which produces:

There are 23,299 days between 30/5/1923 and 14/3/1987

### Solution 2

This can be done a lot easier if using dates between 1971 and 2037.

`<?` `    // convert random dates to unix timestamp` `    // hour minute second month day year` `    \$start = mktime(1, 1, 1, mt_rand(1, 28), mt_rand(1, 12), mt_rand(1972, 2000));` `    \$end = mktime(1, 1, 1, mt_rand(1, 28), mt_rand(1, 12), mt_rand(2001, 2036));` `    ` `    // work out the number of seconds between and then divide by seconds per day` `    \$inbetween = (\$end-\$start) / (60 * 60 * 24);` `    ` `    // output the number of days and the start/end date    ` `    echo 'There are ' . number_format(\$inbetween) . ' days between ' . date('F jS, Y', \$start) . ' and ' . date('F jS, Y', \$end);` `?>`

Which produces:

There are 12,764 days between February 1st, 1992 and January 12th, 2027

## Log

• April 2, 2005 - Added solution 1 and 2.
© 2004-20 robson | cc unless stated