在遊戲聊天,消息等模塊中,我們需要記錄消息距離當前時間已經過了多久。就類似於微信中,消息的記錄時間可能是這樣 :12月25號,那就說明這條消息是12月25號產生的。
需求是這樣的:記錄消息產生的時間距離當前時間
不超過一分鐘的時候,顯示過了XX秒
不超過一個小時的時候,顯示過了幾分鐘
不超過一天的時候,顯示爲XX:XX
超過一天的時候,顯示 幾月幾號
如何判斷髮信息時間,距離當前時間已經超過了一天,需要記錄如下幾個數據
從今天凌晨,到現在,已經過了多久,記錄爲時間戳 $beginToNow
發信息時間,距離當前時間,已經過了多久,記錄爲時間戳 $val
如果 $beginToNow 大於 $val 即沒有超過一天。
詳細代碼如下:
/**
* 獲取時間
* 全站時間顯示規則
* 1.在1小時內的時間,按分鐘進行顯示(9分鐘前)
* 2.在1天內的時間,按文字加時間顯示(今天 05:12)
* 3.在1天以外的時間,按日期加時間顯示(9月7日 13:46)
*
* @param int $time
* @return string 處理後的時間
*/
public static function getTime($time)
{
$nowTime = time();
$todayBeginTime = strtotime('today');
$beginToNow = $nowTime - $todayBeginTime;
$val = max($nowTime - $time, 1);
if ($val < 60) {
return __('{n}秒前', array('n' => $val));
}
elseif ($val >= 60 && $val < (60 * 60)) {
return __('{n}分鐘前', array('n' => intval($val / 60)));
}
elseif ($val >= (60 * 60) && $val < (60 * 60 *24) && $beginToNow > $val) {
return date(_('今天') . ' H:i ', $time);
}
else {
return date(_('m月d日') . ' H:i ', $time);
}
}
頁面顯示,爲了保證時間是變動顯示的,所以常規做法,每次請求頁面的時候,都需要把計算好的時間重新分配到頁面中。可能代碼如下:
$this->assign('time' getTime($time));
這樣做,就必須保證程序分配變量到頁面。還有一個做法,就是直接在頁面中請求服務器的數據,這樣,不需要在程序中分配數據。
<span><?=Helper_Time::getTime(strtotime($value['start_time']))?></span>
/**
* 將秒級時間轉化爲x小時x分x秒的中文格式
*
* @param int $time
* @return string 處理後的時間
*/
public static function getChineseTime($time)
{
// 獲取小時數
$hour = floor($time / 3600);
$min = floor(($time - $hour * 3600) / 60);
$second = ceil($time - $hour * 3600 - $min * 60);
if ($second == 60) {
$second = 59;
}
$cTime = '';
// 小時數大於0
if ($hour > 0) {
$cTime = $hour . '小時';
}
// 如果分和秒都是0,則表示爲整數小時,返回 xx小時整
if ($min == 0 && $second == 0) {
$cTime = $cTime . '整';
return $cTime;
}
// 如果分鐘數大於0
if ($min > 0) {
// 如果分鐘數小於10,且有小時數在前面,則在前面補“零”
if ($min < 10 && $hour > 0) {
$cTime = $cTime . '零';
}
$cTime = $cTime . $min . '分';
}
// 如果秒數爲0,則返回 xx小時(零)xx分
if ($second == 0) {
return $cTime;
}
// 如果是x小時0分鐘x秒
if ($hour > 0 && $min == 0) {
$cTime = $cTime . '零';
}
$cTime = $cTime . $second . '秒';
return $cTime;
}