我希望获得用户登录后的时间。
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";
}
小时似乎有效,但不是分钟。这似乎表明了相反的情况。
答案 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)
*/
答案 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))));