2013-05-26 165 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); 
} 

此處瞭解詳情:

希望它讓你對如何實現自己的效用函數的概念。