php获取自上次登录以来的时间,以秒,分钟或小时为单位

时间:2016-03-02 10:06:46

标签: php

我希望获得用户登录后的时间。

PHP:

$sql = "SELECT * FROM login WHERE username = '$user'" ;
$result = mysqli_query($conn,$sql);
$row = mysqli_fetch_assoc($result);
$lastOnline = $row["lastOnline"];    
if ($lastOnline >= $time-60 or $lastOnline == $time){
  $lastOnline = "Now";
} else if ($lastOnline >= $time-3600){
  $lastOnline = date('i', $lastOnline-$time)." minutes ago";
} else if ($lastOnline >= $time-86400){
  $lastOnline = date('G', $lastOnline-$time)." hours ago";
} else if ($lastOnline >= $time-604800){
  $lastOnline = date('j', $lastOnline-$time)." days ago";
}

小时似乎有效,但不是分钟。这似乎表明了相反的情况。

3 个答案:

答案 0 :(得分:2)

您的计算无效,至少在分钟情况下。

$lastOnline = date('i', $lastOnline-$time)." minutes ago";
                        ^^^^^^^^^^^^^^^^^

这将始终返回负时间戳值,因为lastOnline是过去的,而time是当前的time()。应该是

$lastOnline = date('i', $time-$lastOnline)." minutes ago";
                        ^^^^^^^^^^^^^^^^^

<强> Fiddle

实施例

$lastOnline=time()-600;
$time=time();
$lastOnline = date('i', $time-$lastOnline)." minutes ago";
echo $lastOnline;

输出

10 minutes ago

答案 1 :(得分:0)

<?php

/**
 * Get human readable time difference between 2 dates
 *
 * Return difference between 2 dates in year, month, hour, minute or second
 * The $precision caps the number of time units used: for instance if
 * $time1 - $time2 = 3 days, 4 hours, 12 minutes, 5 seconds
 * - with precision = 1 : 3 days
 * - with precision = 2 : 3 days, 4 hours
 * - with precision = 3 : 3 days, 4 hours, 12 minutes
 * 
 * From: http://www.if-not-true-then-false.com/2010/php-calculate-real-differences-between-two-dates-or-timestamps/
 *
 * @param mixed $time1 a time (string or timestamp)
 * @param mixed $time2 a time (string or timestamp)
 * @param integer $precision Optional precision 
 * @return string time difference
 */
function get_date_diff($time1, $time2, $precision = 2)
{
    // If not numeric then convert timestamps
    if (!is_int($time1)) {
        $time1 = strtotime($time1);
    }
    if (!is_int($time2)) {
        $time2 = strtotime($time2);
    }

    // If time1 > time2 then swap the 2 values
    if ($time1 > $time2) {
        list($time1, $time2) = array(
            $time2,
            $time1
        );
    }

    // Set up intervals and diffs arrays
    $intervals = array(
        'year',
        'month',
        'day',
        'hour',
        'minute',
        'second'
    );
    $diffs     = array();

    foreach ($intervals as $interval) {
        // Create temp time from time1 and interval
        $ttime  = strtotime('+1 ' . $interval, $time1);
        // Set initial values
        $add    = 1;
        $looped = 0;
        // Loop until temp time is smaller than time2
        while ($time2 >= $ttime) {
            // Create new temp time from time1 and interval
            $add++;
            $ttime = strtotime("+" . $add . " " . $interval, $time1);
            $looped++;
        }

        $time1            = strtotime("+" . $looped . " " . $interval, $time1);
        $diffs[$interval] = $looped;
    }

    $count = 0;
    $times = array();
    foreach ($diffs as $interval => $value) {
        // Break if we have needed precission
        if ($count >= $precision) {
            break;
        }
        // Add value and interval if value is bigger than 0
        if ($value > 0) {
            if ($value != 1) {
                $interval .= "s";
            }
            // Add value and interval to times array
            $times[] = $value . " " . $interval;
            $count++;
        }
    }

    // Return string with times
    return implode(", ", $times);
}

/**
Usage:

$t  = '2013-12-29T00:43:11+00:00';
$t2 = '2013-11-24 19:53:04 +0100';

var_dump( get_date_diff( $t, $t2, 1 ) ); // string '1 month' (length=7)
var_dump( get_date_diff( $t, $t2, 2 ) ); // string '1 month, 4 days' (length=15)
var_dump( get_date_diff( $t, $t2, 3 ) ); // string '1 month, 4 days, 5 hours' (length=24)

*/

来源:https://gist.github.com/ozh/8169202

答案 2 :(得分:0)

使用DateTime你可以做这样的事情(但是,它不会忽略零值)。

$then = new \DateTime($lastOnline);
$now = new \DateTime();

$now->diff($then)->format('%m months, %d days, %h hours, %i minutes ago')

或稍高级版本,会自动省略零值

$then = new \DateTime($lastOnline);
$now = new \DateTime();
$diff = $now->diff($then);

$aliases = ["y"=>"years","m"=>"months", "d"=>"days", "h"=>"hours","i"=>"minutes","s"=>"seconds"];

echo implode(", ", array_filter(array_map(function($item) use ($diff, $aliases){
    if($diff->{$item} > 0)
    {
        return $diff->{$item} . " " . $aliases[$item];
    }
},array_keys($aliases))));