Calculate How Long Ago With Timestamp And PHP
November 7, 2017 by Andreas Wik
![](https://awik.io/wp-content/uploads/2017/11/how-long-ago.jpg)
You know how YouTube shows the date the video was published as “X hours ago”, “Y days ago” and “Z years ago” etc, rather than 2017-01-22 for example. This handy function time_ago() takes a Unix timestamp and turns it into a how-long-ago string.
function time_ago($timestamp)
{
$etime = time() - $timestamp;
if ($etime < 1)
{
return '0 seconds';
}
$a = array(12 * 30 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute', 1 => 'second');
foreach ($a as $secs => $str)
{
$d = $etime / $secs;
if ($d >= 1)
{
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago';
}
}
}
Let’s call it.
$now = time();
$five_mins_ago = time_ago($now - 300);
$five_days_ago = time_ago($now - 432000);
$five_months_ago = time_ago($now - 12960000);
$one_year_ago = time_ago($now - 31556952);
echo '<p>' . $five_mins_ago . '</p>';
echo '<p>' . $five_days_ago . '</p>';
echo '<p>' . $five_months_ago . '</p>';
echo '<p>' . $one_year_ago . '</p>';
Turn YYYY-MM-DD into Timestamp
In case the date we use is in the format YYYY-MM-DD for example, we could use the strtotime() function to turn it into a timestamp.
$published_date = '2017-01-31';
$timestamp = strtotime($published_date);
Final Code
// Turn date YYYY-MM-DD into timestamp
$published_date = '2017-01-31';
$published_timestamp = strtotime($published_date);
echo '<p>' . $published_date . ' was ' . time_ago($published_timestamp) . '<p>';
$now = time();
$five_mins_ago = time_ago($now - 300);
$five_days_ago = time_ago($now - 432000);
// Output: Published 5 minutes ago
echo '<p>Published ' . $five_mins_ago . '</p>';
// Output: Published 5 days ago
echo '<p>Published ' . $five_days_ago . '</p>';
function time_ago($timestamp)
{
$etime = time() - $timestamp;
if ($etime < 1)
{
return 'just now';
}
$a = array(12 * 30 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute', 1 => 'second');
foreach ($a as $secs => $str)
{
$d = $etime / $secs;
if ($d >= 1)
{
$r = round($d);
return $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago';
}
}
}