Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate number of day between two dates [duplicate]

Tags:

html

date

php

web

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!

like image 850
poudigne Avatar asked Dec 19 '12 16:12

poudigne


1 Answers

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;
like image 144
Justin ᚅᚔᚈᚄᚒᚔ Avatar answered Sep 22 '22 01:09

Justin ᚅᚔᚈᚄᚒᚔ