/**
  * Return elapsed time between two datetimes in human readable format.
  *
  * @param datetime $start Initial datetime.
  * @param datetime $end Final datetime (default is current time).
  *
  * @return string The formatted elapsed time.
  */
 public static function timeBetween($start, $end = null)
 {
     // Convert datetimes to timestamps
     $start = MiscUtils::datetime2timestamp($start);
     $end = is_null($end) ? time() : MiscUtils::datetime2timestamp($end);
     $SECOND = 1;
     $MINUTE = 60 * $SECOND;
     $HOUR = 60 * $MINUTE;
     $DAY = 24 * $HOUR;
     $WEEK = 7 * $DAY;
     $MONTH = 30 * $DAY;
     $YEAR = 365 * $DAY;
     $increments = array(array($SECOND, 'second'), array($MINUTE, 'minute'), array($HOUR, 'hour'), array($DAY, 'day'), array($WEEK, 'week'), array($MONTH, 'month'), array($YEAR, 'year'));
     $diff = $end - $start;
     $plural = '';
     $units = ceil($diff / $increments[count($increments) - 1][0]);
     $unit = $increments[count($increments) - 1][1];
     for ($i = 1; $i < count($increments); $i++) {
         if ($increments[$i - 1][0] <= $diff && $diff < $increments[$i][0]) {
             $units = ceil($diff / $increments[$i - 1][0]);
             $unit = $increments[$i - 1][1];
             break;
         }
     }
     if ($units > 1) {
         $plural = 's';
     }
     return sprintf("%d %s%s ago", $units, $unit, $plural);
 }