RNK
RNK

Reputation: 5792

date_diff returns 0 if the difference is over a year

I am using this function to get month difference between two dates.

$interval = date_diff(date_create('2015-10-08'), date_create('2014-10-10'));
$total_months = $interval->format('%m');

RESULT: 11 (That's Correct!)

But, When the difference is over a year, then,

$interval = date_diff(date_create('2015-11-08'), date_create('2014-10-10'));
$total_months = $interval->format('%m');

RESULT: 0 (That's Wrong!)

why is it returns 0? Is there any way by which I can get difference between any 2 dates? Thanks!

Upvotes: 1

Views: 1441

Answers (3)

Mubo
Mubo

Reputation: 1070

It is a bit tricky and needs a work round , try the following, that could be it.

$first = new DateTime('2015-11-08',new DateTimeZone('America/New_York'));

$second = new DateTime('2014-10-10',new DateTimeZone('America/New_York'));

$diff = $second->diff($first);

$months = (Int)($diff->days/30); 
echo "The two dates have $months months between them."; 

Output:The two dates have 13 months between them.

Upvotes: 1

MH2K9
MH2K9

Reputation: 12039

2015-11-08 to 2014-10-10 is 12 months become a year. So it returns 0 month. Calculate the number of years from the $interval then add (year * 12) to the number of months. Example here...

$interval = date_diff(date_create('2015-11-08'), date_create('2014-10-10'));
$year = $interval->format('%Y');
echo $total_months = $interval->format('%m') + $year * 12;

Upvotes: 6

iag
iag

Reputation: 166

Or better:

$total_months = $interval->y * 12 + $interval->m;

You have years and months as fields, no need to use format to obtain parts as texts for later adding the parts!

Upvotes: 1

Related Questions