Created
August 17, 2010 14:41
-
-
Save farinspace/530187 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// src: http://www.sajithmr.me/php-time-ago-calculation/ | |
function wpalchemy_time_ago($datefrom,$dateto=-1) | |
{ | |
// Defaults and assume if 0 is passed in that | |
// its an error rather than the epoch | |
if($datefrom<=0) { return "A long time ago"; } | |
if($dateto==-1) { $dateto = time(); } | |
// Calculate the difference in seconds betweeen | |
// the two timestamps | |
$difference = $dateto - $datefrom; | |
// If difference is less than 60 seconds, | |
// seconds is a good interval of choice | |
if($difference < 60) | |
{ | |
$interval = "s"; | |
} | |
// If difference is between 60 seconds and | |
// 60 minutes, minutes is a good interval | |
elseif($difference >= 60 && $difference < 60*60) | |
{ | |
$interval = "n"; | |
} | |
// If difference is between 1 hour and 24 hours | |
// hours is a good interval | |
elseif($difference >= 60*60 && $difference < 60*60*24) | |
{ | |
$interval = "h"; | |
} | |
// If difference is between 1 day and 7 days | |
// days is a good interval | |
elseif($difference >= 60*60*24 && $difference < 60*60*24*7) | |
{ | |
$interval = "d"; | |
} | |
// If difference is between 1 week and 30 days | |
// weeks is a good interval | |
elseif($difference >= 60*60*24*7 && $difference < 60*60*24*30) | |
{ | |
$interval = "ww"; | |
} | |
// If difference is between 30 days and 365 days | |
// months is a good interval, again, the same thing | |
// applies, if the 29th February happens to exist | |
// between your 2 dates, the function will return | |
// the 'incorrect' value for a day | |
elseif($difference >= 60*60*24*30 && $difference < 60*60*24*365) | |
{ | |
$interval = "m"; | |
} | |
// If difference is greater than or equal to 365 | |
// days, return year. This will be incorrect if | |
// for example, you call the function on the 28th April | |
// 2008 passing in 29th April 2007. It will return | |
// 1 year ago when in actual fact (yawn!) not quite | |
// a year has gone by | |
elseif($difference >= 60*60*24*365) | |
{ | |
$interval = "y"; | |
} | |
// Based on the interval, determine the | |
// number of units between the two dates | |
// From this point on, you would be hard | |
// pushed telling the difference between | |
// this function and DateDiff. If the $datediff | |
// returned is 1, be sure to return the singular | |
// of the unit, e.g. 'day' rather 'days' | |
switch($interval) | |
{ | |
case "m": | |
$months_difference = floor($difference / 60 / 60 / 24 /29); | |
while (mktime(date("H", $datefrom), date("i", $datefrom),date("s", $datefrom), date("n", $datefrom)+($months_difference),date("j", $dateto), date("Y", $datefrom)) < $dateto) | |
{ | |
$months_difference++; | |
} | |
$datediff = $months_difference; | |
// We need this in here because it is possible | |
// to have an 'm' interval and a months | |
// difference of 12 because we are using 29 days | |
// in a month | |
if($datediff==12) | |
{ | |
$datediff--; | |
} | |
$res = ($datediff==1) ? "$datediff month ago" : "$datediff months ago"; | |
break; | |
case "y": | |
$datediff = floor($difference / 60 / 60 / 24 / 365); | |
$res = ($datediff==1) ? "$datediff year ago" : "$datediff years ago"; | |
break; | |
case "d": | |
$datediff = floor($difference / 60 / 60 / 24); | |
$res = ($datediff==1) ? "$datediff day ago" : "$datediff days ago"; | |
break; | |
case "ww": | |
$datediff = floor($difference / 60 / 60 / 24 / 7); | |
$res = ($datediff==1) ? "$datediff week ago" : "$datediff weeks ago"; | |
break; | |
case "h": | |
$datediff = floor($difference / 60 / 60); | |
$res = ($datediff==1) ? "$datediff hour ago" : "$datediff hours ago"; | |
break; | |
case "n": | |
$datediff = floor($difference / 60); | |
$res = ($datediff==1) ? "$datediff minute ago" : "$datediff minutes ago"; | |
break; | |
case "s": | |
$datediff = $difference; | |
$res = ($datediff==1) ? "$datediff second ago" : "$datediff seconds ago"; | |
break; | |
} | |
return $res; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment