5

Possible Duplicate:
How to find number of days between two dates using php

I don't want to know HOW to do this. I want to know why it doesn't gives the expected result.

I try to calculate the number of days between two dates formatted as YYYY-mm-dd with this code :

$day1 = strtotime($_REQUEST['start']);
$day2 = strtotime($_REQUEST['end']);

$nbOfDays = $day2 - $day1;
$nbOfDays = ceil($nbOfDays/60/60/24);

echo $nbOfDays;

The problem is when I calculate the difference between 2012-12-01 and 2012-12-31 it gives me 30 days (should be 31) And the difference between 2012-11-01 and 2012-11-30 is also 30 (that is correct!)

Updated for pure informations:

I had to modify this code (thanks to Justin):

$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$interval = round(abs($day2->format('U') - $day1->format('U')) / (60*60*24));
echo $interval;

for :

$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$nb1 = $day2->format('U');
$nb2 = $day1->format('U');
$interval = round(abs($nb1 - $nb2) / (60*60*24));
echo $interval;

because

$day2->format('U') - $day1->format('U')

was equals to 0

So at the end, the difference between 2012-12-31 and 2012-12-01 was still 30. BUUUTTTT, the difference between 2012-11-30 and 2012-11-01 was 29, so

echo $interval +1;

Gives the correct number of days in any case!

4
  • Well i don't really want to know HOW to do it. I want to know WHY the result is correct for some date, but incorrect for other. Commented Dec 19, 2012 at 16:06
  • 3
    1+30=31; 30 is correct for december. Nov seems to be giving 29.041 which you've ceiled up to 30. Not sure why it gives that number..I thought the DST switch was in Oct..but maybe there's some other kind of time adjustment where its off by an hour or so. Commented Dec 19, 2012 at 16:08
  • 4
    (why are yo guys downvoting him? his question is well-formulated) Commented Dec 19, 2012 at 16:09
  • 1
    I think the date arithmetic required in this question is a bit specialised, since the OP appears to require the number of days the start and end dates span, rather than the difference (in days) between these dates. There are 30 days between 2012-12-01 and 2012-12-31 and 29 between 2012-11-01 and 2012-11-30, yet the OP requires 31 and 30 respectively. strtotime() works in local time, so set the local timezone to UTC to avoid any daylight saving time differences throwing the results. Commented Jan 27, 2013 at 13:08

1 Answer 1

9

You should be using date_diff() or its OO equivalent DateTime::diff() for date/time differentials.

$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$interval = $day1->diff($day2);
echo $interval->format('%d');

For PHP version 5.2, you can use the following:

$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$interval = round(abs($day2->format('U') - $day1->format('U')) / (60*60*24));
echo $interval;

For PHP versions prior to 5.2, use strtotime() with the above formula:

$day1 = strtotime($_REQUEST['start']);
$day2 = strtotime($_REQUEST['end']);
$interval = round(abs($day2 - $day1) / (60*60*24));
echo $interval;
Sign up to request clarification or add additional context in comments.

4 Comments

Great answer but our client is using php version < 5.3
Sounds like it's time to upgrade or find better clients. ;)
That same client is using Register_global and magic_quote_gpc.. sorry :( (no we didn't coded their software)
Where does $today and $start come from ? :P

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.