2013-05-26 136 views
1

我正在尝试显示发布评论的时间已过去多长时间。我很困惑,现在我尝试了很多方法,但似乎没有工作。在两个时间戳中找到差异

我的代码只是给年前作为输出。

这里是我的代码:

$date = new DateTime(); 
$newtime = $date->format('U'); 
$oldtime = $row['time']; 
$diffrence = $newtime - $oldtime; 
$date = new DateTime("@$diffrence"); 
$sect = round($date->format('s')); 
$mint = round($date->format('i')); 
$hout = round($date->format('H')); 
$dayt = round($date->format('d')); 
$mont = round($date->format('m')); 
$yeat = round($date->format('Y')); 

if ($yeat > 1970){ 
    $disptime = "years ago"; 
} else if ($yeat < 1970) { 
    $disptime = "$mont months ago"; 
} else if ($mont < 0) { 
    $disptime = "$dayt days ago"; 
} else if ($dayt < 0) { 
    $disptime = "$hout hours $mint min ago"; 
} else if ($hout < 0) { 
    $disptime = "$mint min $sect sec ago"; 
} else { 
    $disptime = "$sect sec ago"; 
} 

编辑获取附近的解决方案改变它yeat 0年至1970年

解决,但其他的方式找到的教程,使我自己的代码在这里解决

$start_date = new DateTime($row['timestamp']); 
$since_start = $start_date->diff(new DateTime($date->format('Y-m-d H:i:s'))); 
$yeat = $since_start->y; 
$mont = $since_start->m; 
$dayt = $since_start->d; 
$hout = $since_start->h; 
$mint = $since_start->i; 
$sect = $since_start->s; 

if ($mint == 0 && $hout == 0 && $dayt == 0 && $mont == 0 && $yeat == 0){ 
    $disptime = "$sect sec ago"; 
} else if ($hout == 0 && $dayt == 0 && $mont == 0 && $yeat == 0) { 
    $disptime = "$mint min ago"; 
} else if ($dayt == 0 && $mont == 0 && $yeat == 0) { 
    $disptime = "$hout hours ago"; 
} else if ($mont == 0 && $yeat == 0) { 
    $disptime = "$dayt days ago"; 
} else if ($yeat == 0) { 
    $disptime = "$mont months ago"; 
} else { 
    $disptime = "$yeat years ago"; 
} 
+4

您应该使用['日期时间:: diff'(http://php.net/manual/datetime.diff.php),然后访问DateInterval的成员。 –

+2

提示:UNIX时间戳是*绝对时间*。减去两个相近的UNIX时间戳会给你一个1970年1月1日之前的日期。你的'$ yeat'将始终有一个1970左右的值。 – deceze

+0

是的,这就是发生了什么。 @deceze – deerox

回答

2

PHP的DateTime类有一个Diff()方法,它正是你想要的。

您的代码将是这个样子:

$date = new DateTime(); 
$rowDate = DateTime::CreateFromFormat('U',$row['time']); 

$interval = $date->diff($rowDate); 

if($interval->y) { 
    echo $interval->format('%y years'); 
} elseif($interval->m) { 
    echo $interval->format('%m months'); 
} elseif($interval->d) { 
    echo $interval->format('%d days'); 
} elseif($interval->h) { 
    echo $interval->format('%h hours'); 
} elseif($interval->i) { 
    echo $interval->format('%i minutes'); 
} elseif($interval->s) { 
    echo $interval->format('%s seconds'); 
} 
+0

** 1369584701 **它在时间戳工作吗? – deerox

+0

在你的代码中没有问题,但有帮助:) @Spudley – deerox

+0

@deerox - 我错过了'CreateFromFormat',所以添加了这个。这将有助于它与时间戳一起工作。很高兴它有帮助。 – Spudley

1

查看cakephp的TimeHelpers:

public static function niceShort($dateString = null, $timezone = null) { 
    if (!$dateString) { 
    $dateString = time(); 
    } 
$date = self::fromString($dateString, $timezone); 

if (self::isToday($dateString, $timezone)) { 
    return __d('cake', 'Today, %s', self::_strftime("%H:%M", $date)); 
} 
if (self::wasYesterday($dateString, $timezone)) { 
    return __d('cake', 'Yesterday, %s', self::_strftime("%H:%M", $date)); 
} 
if (self::isTomorrow($dateString, $timezone)) { 
    return __d('cake', 'Tomorrow, %s', self::_strftime("%H:%M", $date)); 
} 

$d = self::_strftime("%w", $date); 
$day = array(
__d('cake', 'Sunday'), 
__d('cake', 'Monday'), 
__d('cake', 'Tuesday'), 
__d('cake', 'Wednesday'), 
__d('cake', 'Thursday'), 
__d('cake', 'Friday'), 
__d('cake', 'Saturday') 
); 
if (self::wasWithinLast('7 days', $dateString, $timezone)) { 
    return sprintf('%s %s', $day[$d], self::_strftime(self::$niceShortFormat, $date)); 
} 
if (self::isWithinNext('7 days', $dateString, $timezone)) { 
    return __d('cake', 'On %s %s', $day[$d], self::_strftime(self::$niceShortFormat, $date)); 
} 

$y = ''; 
if (!self::isThisYear($date)) { 
    $y = ' %Y'; 
} 
    return self::_strftime(self::convertSpecifiers("%b %eS{$y}, %H:%M", $date), $date); 
} 

此处了解详情:

希望它让你对如何实现自己的效用函数的概念。