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!

Community
  • 1
  • 1
poudigne
  • 1,694
  • 3
  • 17
  • 40
  • 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. – poudigne Dec 19 '12 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. – mpen Dec 19 '12 at 16:08
  • 4
    (why are yo guys downvoting him? his question is well-formulated) – mpen Dec 19 '12 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. – MrWhite Jan 27 '13 at 13:08

1 Answers1

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;
Justin ᚅᚔᚈᚄᚒᚔ
  • 15,081
  • 7
  • 52
  • 64