In building this issue tracker for work, I decided that having 26 Mar 2008 5:33pm was not going to fly.
Taking some inspiration from 37signals and their contextual dates, I built this easy-to-use-yet-encompassing function.
It is yours for the taking, Internet.
updated 5/7: I made a few tweaks to remove occurrences like '0 seconds ago', '1 seconds ago', 'about 23 hours ago', etc.
<?php
function contextualTime($small_ts, $large_ts=false) {
if(!$large_ts) $large_ts = time();
$n = $large_ts - $small_ts;
if($n <= 1) return 'less than 1 second ago';
if($n < (60)) return $n . ' seconds ago';
if($n < (60*60)) { $minutes = round($n/60); return 'about ' . $minutes . ' minute' . ($minutes > 1 ? 's' : '') . ' ago'; }
if($n < (60*60*16)) { $hours = round($n/(60*60)); return 'about ' . $hours . ' hour' . ($hours > 1 ? 's' : '') . ' ago'; }
if($n < (time() - strtotime('yesterday'))) return 'yesterday';
if($n < (60*60*24)) { $hours = round($n/(60*60)); return 'about ' . $hours . ' hour' . ($hours > 1 ? 's' : '') . ' ago'; }
if($n < (60*60*24*6.5)) return 'about ' . round($n/(60*60*24)) . ' days ago';
if($n < (time() - strtotime('last week'))) return 'last week';
if(round($n/(60*60*24*7)) == 1) return 'about a week ago';
if($n < (60*60*24*7*3.5)) return 'about ' . round($n/(60*60*24*7)) . ' weeks ago';
if($n < (time() - strtotime('last month'))) return 'last month';
if(round($n/(60*60*24*7*4)) == 1) return 'about a month ago';
if($n < (60*60*24*7*4*11.5)) return 'about ' . round($n/(60*60*24*7*4)) . ' months ago';
if($n < (time() - strtotime('last year'))) return 'last year';
if(round($n/(60*60*24*7*52)) == 1) return 'about a year ago';
if($n >= (60*60*24*7*4*12)) return 'about ' . round($n/(60*60*24*7*52)) . ' years ago';
return false;
}
?>
Now you'll get dates/times like about 35 minutes ago, yesterday, or even about 2 years ago.