Location: PHPKode > scripts > Relative Time Calculator > relative time/relativeTime.php
<?php
/*
** Please do not remove this comment!
** Use of this Software implies explicit agreement to the Terms of
** Use (http://artbyjb.com/terms/) and the End-User Software License
** Agreement (http://artbyjb.com/terms/eula). This Software is
** provided on an "as-is" basis and cannot be guaranteed to be free
** of defects or that the Software will meet your requirements.

** Title: Relative Time Calculator
** Description: This PHP script calculates and returns an easy-to-read relative time stamp based on how long ago an event occurred in the past.

** Author: Jeffrey Bennett
** URL: http://artbyjb.com/code/?p=11
** Date: March 10, 2011

** @access	public
** @param	string	(required)	$datetime
** *** Date-time stamp or seconds since the Unix Epoch (1970-01-01 00:00:00)
** @param	bool	(optional)	$seconds
** *** If true, this will return only the number of seconds difference between $datetime and the current time stamp.
** *** If false (default), this will return the relative time stamp.
** @param	bool	(optional)	$ago
** *** If true (default), this will append "ago" to the relative time stamp, unless $seconds is true.
** *** If false, this will not append "ago" to the relative time stamp.
** @return	string
*/

function relativeTime($datetime, $seconds = false, $ago = true) {
 $time = time(); // Store time to ensure consistency.
 $datetime = (is_int($datetime) && strlen($datetime) >= 1 && strlen($datetime) <= strlen($time)) ? $datetime : strtotime($datetime); // Determines if $datetime is in date format or if it's the number of seconds since the Unix Epoch.
 $shift = $time - $datetime; // Calculates time difference in seconds.

 $minute = 60;
 $hour = 3600;
 $day = 86400;
 $week = 604800;
 $month = 2592000;
 $year = 31536000;
 $decade = 315360000;

 if ($seconds == true) {
  return $shift;
 } else {
  if ($shift < 0) { // Date in the future
   $diff = "future";
   $term = "event";
  } elseif ($shift < 5) { // Less than 5 seconds
   $diff = "just a";
   $term = "moment";
  } elseif ($shift < $minute) { // Less than 60 seconds
   $diff = $shift;
   $term = "second";
  } elseif ($shift < $minute+30) { // Less than 1 minute, 30 seconds
   $diff = "about a";
   $term = "minute";
  } elseif ($shift < $minute*3) { // Less than 3 minutes
   $diff = "a few";
   $term = "minutes";
  } elseif ($shift >= $minute*30 && $shift < $minute*40) { // About half an hour
   $diff = "about half an";
   $term = "hour";
  } elseif ($shift < $hour) { // Less than 60 minutes
   $diff = floor($shift / $minute);
   $term = "minute";
  } elseif ($shift < 4200) { // Less than 1 hour, 10 minutes
   $diff = "about an";
   $term = "hour";
  } elseif ($shift < $day) { // Less than 1 day
   $diff = floor($shift / $hour);
   $term = "hour";
   $diff2 = floor($shift / $minute);
   $term2 = "minute";

   $maxdiff = $minute;
   $modulus = $diff * $maxdiff;
   $diff2 = $diff2 % $modulus;
  } elseif ($shift < $week) { // Less than 1 week
   $diff = floor($shift / $day);
   $term = "day";
   $diff2 = floor($shift / $hour);
   $term2 = "hour";

   $maxdiff = 24;
   $modulus = $diff * $maxdiff;
   $diff2 = $diff2 % $modulus;
  } elseif ($shift < $month) { // Less than 1 month
   $diff = floor($shift / $week);
   $term = "week";
   $diff2 = floor($shift / $day);
   $term2 = "day";

   $maxdiff = 7;
   $modulus = $diff * $maxdiff;
   $diff2 = $diff2 % $modulus;
  } elseif ($shift < $year) { // Less than 1 year
   $diff = floor($shift / $month);
   $term = "month";
   $diff2 = floor($shift / $day);
   $term2 = "day";

   $maxdiff = 30;
   $modulus = $diff * $maxdiff;
   $diff2 = $diff2 % $modulus;
   if ($diff2 == 7 || $diff2 == 14 || $diff2 == 21) {
    $diff2 = $diff2 / 7;
    $term2 = "week";
   }
  } elseif ($shift < $decade) { // Less than 10 years
   $diff = floor($shift / $year);
   $term = "year";
   $diff2 = floor($shift / $month);
   $term2 = "month";

   $maxdiff = 12;
   $modulus = $diff * $maxdiff;
   $diff2 = $diff2 % $modulus;
  } elseif ($shift < $decade*3) { // Less than 30 years
   $diff = floor($shift / $decade);
   $term = "decade";
   $diff2 = floor($shift / $year);
   $term2 = "year";

   $maxdiff = 10;
   $modulus = $diff * $maxdiff;
   $diff2 = $diff2 % $modulus;
  } elseif ($shift >= $decade*3) { // More than 30 years
   $diff = "many";
   $term = "year";
  }

  if (($term == "year" && $diff == "many") || ($diff != 1 && $diff != '' && preg_match("/^[0-9]+$/", $diff))) {
   $term .= "s";
  }
  if ($diff2 != 1 && $diff2 != '' && preg_match("/^[0-9]+$/", $diff2)) {
   $term2 .= "s";
  }
  if ($diff != "future" && (!isset($ago) || $ago != false)) { // Appends "ago" to the end of the relative time stamp unless event is in the future.
   $ago = " ago";
  } else {
   $ago = ""; // Remove "ago" for future date.
  }
  if (isset($diff2) && $diff2 != '' && isset($term2) && $term2 != '') {
   return "$diff $term, $diff2 $term2$ago";
  } else {
   return "$diff $term$ago";
  }
 }
}
?>
Return current item: Relative Time Calculator