将时间转换为以前的格式失败

时间:2017-07-23 02:06:35

标签: php datetime

使用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;唯一的问题是为什么?

3 个答案:

答案 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;
}