使用this thread的答案时。它失败了,我检查了$now, $ago, $diff
和$string
,它们都工作或处于适当的状态。
public static function convertTime($datetime)
{
$now = new DateTime;
$now->setTimezone(new DateTimeZone('Asia/Manila'));
$now->format('Y-m-d h:i:s');
$ago = new DateTime($datetime);
$diff = $now->diff($ago);
$diff->w = floor($diff->d / 7);
$diff->d -= $diff->w * 7;
$string = [
'y' => 'year',
'm' => 'month',
'w' => 'week',
'd' => 'day',
'h' => 'hour',
'i' => 'minute',
's' => 'second'
];
foreach ($string as $k => &$v) {
if ($diff->$k) {
$v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
} else {
unset($string[$k]);
}
}
}
为什么会失败:
如果我var_dump($diff->$k)
,它返回给我的所有值都是0,使其为null;唯一的问题是为什么?
答案 0 :(得分:0)
也许您忘了返回值?
答案 1 :(得分:0)
您的方法需要返回一个值,这可能是它当前返回NULL
的主要原因。
但是,您还应该为输出创建一个全新的字符串,因为您每次循环遍历$v
数组时似乎都会覆盖$string
。
我还重新格式化了输出,因为单词之间缺少一些空格。
顺便说一下:你不需要取消设置$string[$k]
,因为无论如何你只会循环一次通过数组。所以这并没有改变任何事情。
这对我来说很好:
public static function convertTime($datetime)
{
$now = new DateTime;
$now->setTimezone(new DateTimeZone('Asia/Manila'));
$now->format('Y-m-d h:i:s');
$ago = new DateTime($datetime);
$diff = $now->diff($ago);
$diff->w = floor($diff->d / 7);
$diff->d -= $diff->w * 7;
$string = [
'y' => 'year',
'm' => 'month',
'w' => 'week',
'd' => 'day',
'h' => 'hour',
'i' => 'minute',
's' => 'second'
];
$result = '';
foreach ($string as $k => $v) {
if ($diff->$k) {
$result .= $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's ' : ' ');
}
}
return $result;
}
答案 2 :(得分:0)
查看代码:
function ego($date) {
$delta = time() - strtotime($date);
if ( $delta < 60 && $delta >= 0)$data = strval(round(($delta),0)). ' second ego';
elseif ($delta >= 60 && $delta < (60*60))$data = strval(round(($delta/60),0)). ' minute ego';
elseif ($delta >= (60*60) && $delta < (24*60*60))$data = strval(round(($delta/3600),0)). ' houre ego';
elseif ($delta >= (24*60*60) && $delta < (24*60*60*365))$data = strval(round(($delta/86400),0)). ' day ego';
elseif ($delta >= (24*60*60*365)) $data = strval(round(($delta/31536000),0)). ' year ego';
return $data;
}