2011-11-23 24 views
-4

我見過其他一些人談論相對日期,但我仍然沒有設法使它正常工作。從Unix的時間戳與PHP的相對日期

我的腳本從MySQL數據庫拉動unix時間戳,我希望它顯示是這樣的:

2分鐘前
17小時以前
週二11月10日晚上7點

感謝任何可以幫助的人。

+1

你並不是在問一個實際的技術問題,您也不會發布人員的源代碼來識別缺陷並幫助您解決問題。 –

+0

我做了搜索 - 但我只能找到與我的困境無關的答案。在ASP.NET中有一個與日期時間有關的事,但這不是我所要求的。還有一個與日期時間有關的問題,但我又處理UNIX時間戳。 我也不一定要求某人爲我寫一個函數,就像任何人遇到了一個適合其他地方的東西,或者如果他們之前已經爲另一個項目寫了一個東西。 – Alfo

回答

2

有可能是一個更好的方式來做到這一點,但這裏有一個粗略的功能,我寫了很久以前的事了這一點:

function time_ago($datetime) 
{ 
    if (is_numeric($datetime)) { 
     $timestamp = $datetime; 
    } else { 
     $timestamp = strtotime($datetime); 
    } 
    $diff=time()-$timestamp; 

    $min=60; 
    $hour=60*60; 
    $day=60*60*24; 
    $month=$day*30; 

    if($diff<60) //Under a min 
    { 
     $timeago = $diff . " seconds"; 
    }elseif ($diff<$hour) //Under an hour 
    { 
     $timeago = round($diff/$min) . " mins"; 
    }elseif ($diff<$day) //Under a day 
    { 
     $timeago = round($diff/$hour) . " hours"; 
    }elseif ($diff<$month) //Under a day 
    { 
     $timeago = round($diff/$day) . " days"; 
    }else 
    { 
     $timeago = round($diff/$month) ." months"; 
    } 

    return $timeago; 

} 
+0

這是否需要日期時間(00:00 00 00 ish)或UNIX時間戳(1322061969)? 如果它需要一個日期時間,我該如何將時間戳轉換爲它? – Alfo

+0

需要一個日期時間。我已經更新了我的答案,以顯示它如何看起來如果你想傳遞一個unix時間戳 – Nick

+0

非常感謝。對此,我真的非常感激。 – Alfo

0

通常通過一些客戶端邏輯來確定顯示時間字符串的粒度。假設你的查詢返回的UNIX風格的時間戳:

SELECT UNIX_TIMESTAMP(now()), blog_post_timestamp FROM ... 

你會得到(使用編造的號碼):1234 900你的兩個時間值。因此,時間差爲334秒(1234-900),並且你會對其進行處理:

if (time_difference < 60) { 
    $time_display = "Posted $time_difference seconds ago"; 
} if ((time_difference >= 60) AND (time_difference < 3600)) { 
    $minutes = ceil($time_difference/60); 
    $time_display = "Posted $minutes minutes ago"; 
} else { 
    $hours = ceil($time_difference/3600); 
    $time_display = "Posted $hours hours ago"; 
} 

,你只要不斷添加更多的時間單位,只要你想:天,周,月,年,百年來,等...

1

我今天剛寫了一個簡單的功能,
供大家參考: -

/* calculate simple human readable time format */ 
function simple_human_date($from, $to) 
{ 
$diff = $to - $from; 
$range = array 
( 
    'year' => 31536000, 
    'month' => 2592000, 
    'day' => 86400, 
    'week' => 604800, 
    'hour' => 3600, 
    'min' => 60 
); 

foreach ($range as $unit=>$sec) 
{ 
    if ($diff > $sec) 
    { 
     $round = round($diff/$sec); 
     break; 
    } 
} 

if (empty($round)) 
{ 
    return 'just now'; 
} 
else 
{ 
    return sprintf('%d %s%s ago', $round, $unit, $round>1?'s':''); 
} 
} 

注意:這個想法是組裝這樣的: - http://youlookfab.com/welookfab/

+2

除一年內不總是31536000秒。而且一天中並不總是86400秒。請不要重新計算日期數學。這比你想象的要困難得多。有很多你需要跟蹤(夏令時,閏秒,閏年等)... – ircmaxell

+1

呃...是爲了簡單的用法(根據功能說),加上超過50%的人留在地區沒有DST :) – ajreal