Calculate the number of days between two dates

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

I do not want to know HOW to do this. I want to know why this does not produce the expected result.

I am trying 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 ( it is right!)

Updated for clean info:

I had to change this code (thanks 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 0

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

 echo $interval +1; 

Gives the correct number of days anyway!

+4
source share
1 answer

You should use date_diff() or its OO DateTime::diff() equivalent 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; 
+9
source

All Articles