This class is pretty much a direct port of John Resig’s JavaScript Pretty Date to PHP 5. A few notes:
- Requires PHP >= 5.10, due to the usage of PHP’s new DateTimeclass.
- The new DateTime object parses strings using PHP’s strtotime, so you don’t need to pass in an ISO8601 formatted date, as in JavaScript Pretty Date. Try “now”, or “next Wednesday”, or “+2 weeks 4 days 23 hours 9 seconds”.
- Extended to handle Months and Years in the past (JavaScript version only goes to weeks)
Usage:
// pass in a String DateTime, compared to another String DateTime (defaults to now) $myString = Date_Difference::getStringResolved('-7 weeks'); $myString = Date_Difference::getStringResolved('-7 weeks', '+1 week'); // pass in a DateTime object, compared to another DateTime object (defaults to now) // useful with the Propel ORM, which uses DateTime objects internally. $myString = Date_Difference::getString(new DateTime('-7 weeks')); $myString = Date_Difference::getString(new DateTime('-7 weeks'), new DateTime('+1 week'));
Download PHP Pretty Date (PHP 5.10+, 1.86KB)
http://www.zachleat.com/Projects/phpPrettyDate/Date_Difference.phps

Subscribe
Follow
3 Comments
Thanks for this man! Was going to use the js version but I like the php better!
This is great, i ran into a few issues with accurate yesterday handling, but i fixed them. you can see the fix here http://noise.weareplic.com/snippets/snippet-pretty-dates-php/30/
Loverly script.
Support for future!
= 5.1 by Zach Leatherman (zachleat.com)
// Slight modification denoted below to handle months and years.
class prettydate
{
public static function getStringResolved($date, $compareTo = NULL)
{
if(!is_null($compareTo)) {
$compareTo = new DateTime($compareTo);
}
return self::getString(new DateTime($date), $compareTo);
}
public static function getString(DateTime $date, DateTime $compareTo = NULL)
{
if(is_null($compareTo)) {
$compareTo = new DateTime('now');
}
$diff = $compareTo->format('U') - $date->format('U');
$dayDiff = floor($diff / 86400);
if(is_nan($dayDiff)) return '';
$end = 'ago';
if($dayDiff < 0) { # date is in the future
$end = 'left';
$dayDiff *= -1;
}
if($dayDiff == 0) {
if($diff < 60) {
return 'Just now';
} elseif($diff < 120) {
return '1 minute '.$end;
} elseif($diff < 3600) {
return floor($diff/60) . ' minutes '.$end;
} elseif($diff < 7200) {
return '1 hour '.$end;
} elseif($diff < 86400) {
return floor($diff/3600) . ' hours '.$end;
}
} elseif($dayDiff == 1) {
return 'Yesterday';
} elseif($dayDiff < 7) {
return $dayDiff . ' days '.$end;
} elseif($dayDiff == 7) {
return '1 week '.$end;
} elseif($dayDiff < (7*6)) { // Modifications Start Here
// 6 weeks at most
return ceil($dayDiff/7) . ' weeks '.$end;
} elseif($dayDiff < 365) {
return ceil($dayDiff/(365/12)) . ' months '.$end;
} else {
$years = round($dayDiff/365);
return $years . ' year' . ($years != 1 ? 's' : '') . ' '.$end;
}
}
}
One Trackback
[...] there are other similar tools out there in JavaScript, PHP, and, I am sure, many other languages, none adequately met my goals. Therefore, I created the [...]