Why does datetime->days always returns a positive number

You could use DateInterval::format.

return $interval->format("%r%a");

Cast to int if needed:

return (int)$interval->format("%r%a");


If Date is in past then invert will 1.
If Date is in future then invert will 0.

$invert    = $interval->invert; 

Here is your answer:

$today = new DateTime();
$date = new DateTime('2013-03-10');
$interval = $today->diff($date);
echo $interval->format("%r%a");

Test it here