在游戏聊天,消息等模块中,我们需要记录消息距离当前时间已经过了多久。就类似于微信中,消息的记录时间可能是这样 :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;
}