Skip to content

Instantly share code, notes, and snippets.

@ericrallen
Created January 22, 2013 22:47
Show Gist options
  • Save ericrallen/4599412 to your computer and use it in GitHub Desktop.
Save ericrallen/4599412 to your computer and use it in GitHub Desktop.
Create an estimated relative date for any past date string via PHP.
<?php
/*--------------------------------------------------------------------------
This function accepts any date string that str_to_time() can handle
and returns a relative date string
It can account for seconds, minutes, days, weeks, months, years,
decades, centuries, and millenia
It does not currently support dates in the future
This function was heavily modified from a StackOverflow answer
--------------------------------------------------------------------------*/
//BEGIN borrowed: http:stackoverflow.com/questions/11/calculating-relative-time/12#answer-18393
function time_since($original = null) {
//make sure we were given a time
if($original) {
//make sure date is a valid unix timestamp
//http:stackoverflow.com/questions/2524680/check-whether-the-string-is-a-unix-timestamp#answer-2524761
if((string) (int) $original !== $original) {
//go ahead and convert it, just to be sure
$original = date('U', strtotime($original));
}
//time periods
$second = 1; //1 second in Unix Time
$minute = $second * 60; //1 minut in Unix Time
$hour = $minute * 60; //1 hour in Unix Time
$day = $hour * 24; //1 day in Unix Time
$week = $day * 7; //1 week in Unix Time
$month = $day * 30; //1 month in Unix Time
$year = $day * 365; //1 year in Unix Time
$decade = $year * 10; //10 years in Unix Time
$century = $decade * 10; //100 years in Unix Time
$millenium = $century * 10; //1,000 years in Unix Time
$today = time(); //current Unix Time
//initialize vars to store our time and name
$name = '';
$total = 0;
//get seconds since the date given to the function
$since = $today - $original;
//create array to store textual representation and Unix second representations
$checks = array(
array('second', $second),
array('minute', $minute),
array('hour', $hour),
array('day', $day),
array('week', $week),
array('month', $month),
array('year', $year),
array('decade', $decade),
array('century', $century),
array('millenium', $millenium)
);
//iterate through checks to find the largest value for relative time display
foreach($checks as $key => $check) {
$seconds = $check[1];
$count = floor($since / $seconds);
//if we can't go any further, exit loop
if($count < 1) {
break;
//if we can, update the name and the total
} else {
$name = $check[0];
$total = $count;
}
}
//begin creating our return value by adding total
$return = $total;
//if it's greater than 1
if($total > 1) {
//if this is millenia, change the pluralization accordingly
if($name == 'millenium') {
$return .= ' ' . 'millenia';
//if this is centuries, change the pluralization accordingly
} elseif($name == 'century') {
$return .= ' ' . 'centuries';
//otherwise just add an s
} else {
$return .= ' ' . $name . 's';
}
//if it isn't, just return the singular name
} else {
$return .= ' ' . $name;
}
//append 'ago' to the return string
$return .= ' ago';
//return time since
return $return;
} else {
return $false;
}
}
//END borrowed
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment