使用PHP的Unix时间戳的相对日期

使用PHP的Unix时间戳的相对日期,php,Php,我见过其他一些人谈论相对日期,但我仍然没能让它正常工作 我的脚本从MySQL数据库中提取unix时间戳,我希望它显示如下内容: 2分钟前 16小时前 11月10日星期二晚上7点 感谢所有能够提供帮助的人。这通常是通过一些客户端逻辑来确定显示时间字符串的粒度。假设查询返回unix样式的时间戳: SELECT UNIX_TIMESTAMP(now()), blog_post_timestamp FROM ... 您将获得(使用编造的数字):1234900两个时间值。因此,时差为334秒(1234-

我见过其他一些人谈论相对日期,但我仍然没能让它正常工作

我的脚本从MySQL数据库中提取unix时间戳,我希望它显示如下内容:

2分钟前
16小时前
11月10日星期二晚上7点


感谢所有能够提供帮助的人。

这通常是通过一些客户端逻辑来确定显示时间字符串的粒度。假设查询返回unix样式的时间戳:

SELECT UNIX_TIMESTAMP(now()), blog_post_timestamp FROM ...
您将获得(使用编造的数字):
1234900
两个时间值。因此,时差为334秒(1234-900),您可以处理它:

if (time_difference < 60) {
   $time_display = "Posted $time_difference seconds ago";
} if ((time_difference >= 60) AND (time_difference < 3600)) {
   $minutes = ceil($time_difference / 60);
   $time_display = "Posted $minutes minutes ago";
} else {
   $hours = ceil($time_difference / 3600);
   $time_display = "Posted $hours hours ago";
}
if(时差<60){
$time\u display=“在秒前发布$time\u差异”;
}如果((时差>=60)和(时差<3600)){
$minutes=ceil(时差/60);
$time\u display=“在$minutes分钟前发布”;
}否则{
$hours=ceil(时差/3600);
$time\u display=“在$hours前发布”;
}

您只需不断添加更多您想要的时间单位:天、周、月、年、世纪等等。

可能有更好的方法,但这里有一个我多年前为此编写的粗略函数:

function time_ago($datetime)
{
    if (is_numeric($datetime)) {
      $timestamp = $datetime;
    } else {
      $timestamp = strtotime($datetime);
    }
    $diff=time()-$timestamp;

    $min=60;
    $hour=60*60;
    $day=60*60*24;
    $month=$day*30;

    if($diff<60) //Under a min
    {
        $timeago = $diff . " seconds";
    }elseif ($diff<$hour) //Under an hour
    {
        $timeago = round($diff/$min) . " mins";
    }elseif ($diff<$day) //Under a day
    {
        $timeago = round($diff/$hour) . " hours";
    }elseif ($diff<$month) //Under a day
    {
        $timeago = round($diff/$day) . " days";
    }else 
    {
        $timeago = round($diff/$month) ." months";
    }

    return $timeago;

}
function time\u ago($datetime)
{
如果(是数值($datetime)){
$timestamp=$datetime;
}否则{
$timestamp=strottime($datetime);
}
$diff=time()-$timestamp;
$min=60;
$hour=60*60;
$day=60*60*24;
$month=$day*30;

如果($diff我今天刚刚写了一个简单的函数,
供参考:-

/* calculate simple human readable time format */
function simple_human_date($from, $to)
{
$diff  = $to - $from;
$range = array
(   
    'year'  => 31536000,
    'month' => 2592000,
    'day'   => 86400,
    'week'  => 604800,
    'hour'  => 3600,
    'min'   => 60
);  

foreach ($range as $unit=>$sec)
{   
    if ($diff > $sec)
    {
       $round = round($diff/$sec);
       break;
    }
}   

if (empty($round))
{   
    return 'just now';
}   
else
{   
    return sprintf('%d %s%s ago', $round, $unit, $round>1?'s':'');
}   
}
注意:这个想法是在PHP5.3.0中组装如下内容:-

+

例如:

$d1 = new DateTime();
$d2 = new DateTime();
$d2->modify('-1 day');
echo $d2->diff($d1)->format('%d') ' day';
另见

这需要日期时间(00:00 ish)还是UNIX时间戳(1322061969)?如果它需要一个日期时间,我如何将时间戳转换为它?它需要一个日期时间。我已经更新了我的答案,以显示如果您想传递unix时间戳,它会是什么样子。非常感谢。我真的很感激。不用担心,正如我所说,它不是最好的函数,但它可以用于简单的事情。它没有考虑到时间戳avings和$min/$hour/$day/$month变量可能应该显式设置,而不是让PHP来计算它们,但这在服务器上不应该是一个很大的开销,所以我想这不是一个大问题。除了一年中不总是有31536000秒。一天中也不总是有86400秒。请不要重新发明日期数学。这比你想象的要困难得多。有很多事情你需要跟踪(夏令时、闰秒、闰年等)…好吧…是为了简单使用(根据函数的说法),加上超过50%的人住在没有DST的地区:)你不是在问一个实际的技术问题,也不是在发布源代码让人们识别缺陷并帮助你修复。我做了搜索,但我只能找到与我的困境无关的答案。ASP.NET中有一个与datetime有关,但这不是我要问的。还有一个与datetime有关,但同样,我要处理的是UNIX时间戳,我也不一定要求别人为我编写一个函数,只是如果有人遇到一个适合其他地方的函数,或者他们以前为另一个项目编写过一个函数。