Unix时间戳到天,小时,分钟

时间:2009-06-27 14:47:34

标签: php sql mysql

因此,我的用户表中有一个名为last_active的字段,每次用户重新加载页面时都会更新。
它存储在unix时间戳中。

我想像这样输出:Last online: 4 d 18 h 19 m ago

如何做到这一点?你能用php的date()吗?

谢谢。

5 个答案:

答案 0 :(得分:4)

如果您愿意,可以直接在MySQL中实现:

select date_format(from_unixtime(current_timestamp - last_timestamp), 
    'Last online: %e days, %k hours, %i minutes, %s seconds ago.');

current_timestamp如果您希望就地计算,可以替换为unix_timestamp(now())

DATE_FORMAT允许您根据特定日期拥有自定义字符串。如果使用两个时间戳之间的差异填充其日期,它将按照您的要求运行。

上述解决方案仅在不到一个月的情况下才能使用;如果你想要一年中的几天,请使用%j。该功能的文档显示更多。

答案 1 :(得分:3)

最简单的方法是使用last_active时间戳和当前时间戳time()。然后从当前时间戳中减去最后一个活动,然后简单地将结果除以一天中的秒数以获得天数差异,以小时为单位的秒数以获得小时差异等等。

在某些特殊情况下(闰年等),这种方法可能稍微不准确,但它应该足以让您使用更简单的用例

答案 2 :(得分:1)

答案 3 :(得分:1)

在找到几十个破解或半解决方案之后,我为UNIX时间戳构建了以下函数 您可以限制详细级别......

echo timeDiff(1350297908);将显示“5分42秒前” echo timeDiff(1350297908, 1);只会显示“5分钟前”。

function timeDiff( $from, $levels=7 ){  
    $now = time();
    $diff = ($from > $now) ? $from - $now : $now - $from;
    $status = ($from > $now) ? ' away' : ' ago';
    $times = array(31536000, 2628000, 604800, 86400, 3600, 60, 1);
    $words = array('year', 'month', 'week', 'day', 'hour', 'minute', 'second');
    $str = array();
    foreach ($times as $k=>$v){
        $val = floor($diff/$v);
        if ($val) {
            $str[] = $val .' '. $words[$k] . ($val==1 ? '' : 's');
            $levels--;
        }
        $diff %= $v;
        if ($levels==0) break;
    }
    return implode(', ', $str) . $status;
}

答案 4 :(得分:0)

当我需要这种解决方案时,我写了这个简单的函数(输入时间为几分钟):

function minutes_to_time($minutes)
{
    $obj = "";

    // extract days
    $days = floor($minutes/(1440)); # Divide on the daily minutes 60 min * 24 hours
    # echo "Days: " . $days;

    // extract hours
    $hours = floor(($minutes-($days*1440))/60);
    # echo " Hours: " . $hours;

    // extract left minutes
    $minutes = ($minutes-($days*24*60)-($hours*60));
    # echo " Minutes: " . $minutes;

    if ($days > 0)
    {
        $obj .= $days . "d ";
    }
    if ($hours > 0)
    {
        $obj .= $hours . "h ";
    }
    if ($minutes >= 0)
    {
        $obj .= $minutes . "m ";
    }

    $obj .= "ago";

    return $obj;
}