长沙论坛制作:对Discuz时间处理函数dgmdate()的简单说明

2015-01-15 14:58 栏目:技术开发 查看(28476)

使用过Discuz的朋友都会知道dz的时间显示出来不都是标准时间,比如我们发一篇帖子,里面的时间可能包含了多少秒前、多少分钟前、几个小时前、几天前等等。那么是为什么会这样显示,而不是直接显示标准的具体的时间呢,那就是因为dz在内部增加了一个时间处理方法dgmdate().

至于在这里了解这个方法有什么用?我认为不管是做Discuz开发的,还是使用DZ的网站运营人员都有用处。对于开发者而言如果需要实现跟DZ本身模块相同的时间显示风格,我们不需要自己想半天来写一个这样的方法,而直接调用即可。对于运营者来说我们可以了解这个时间到底是被怎么样处理的。好了首先我们就贴出那个函数的全部代码吧:

function dgmdate($timestamp, $format = 'dt', $timeoffset = '9999', $uformat = '') {
global $_G;
$format == 'u' && !$_G['setting']['dateconvert'] && $format = 'dt';
static $dformat, $tformat, $dtformat, $offset, $lang;
if($dformat === null) {
$dformat = getglobal('setting/dateformat');
$tformat = getglobal('setting/timeformat');
$dtformat = $dformat.' '.$tformat;
$offset = getglobal('member/timeoffset');
$sysoffset = getglobal('setting/timeoffset');
$offset = $offset == 9999 ? ($sysoffset ? $sysoffset : 0) : $offset;
$lang = lang('core', 'date');
}
$timeoffset = $timeoffset == 9999 ? $offset : $timeoffset;
$timestamp += $timeoffset * 3600;
$format = empty($format) || $format == 'dt' ? $dtformat : ($format == 'd' ? $dformat : ($format == 't' ? $tformat : $format));
if($format == 'u') {
$todaytimestamp = TIMESTAMP - (TIMESTAMP + $timeoffset * 3600) % 86400 + $timeoffset * 3600;
$s = gmdate(!$uformat ? $dtformat : $uformat, $timestamp);
$time = TIMESTAMP + $timeoffset * 3600 - $timestamp;
if($timestamp >= $todaytimestamp) {
if($time > 3600) {
$return = intval($time / 3600).' '.$lang['hour'].$lang['before'];
} elseif($time > 1800) {
$return = $lang['half'].$lang['hour'].$lang['before'];
} elseif($time > 60) {
$return = intval($time / 60).' '.$lang['min'].$lang['before'];
} elseif($time > 0) {
$return = $time.' '.$lang['sec'].$lang['before'];
} elseif($time == 0) {
$return = $lang['now'];
} else {
$return = $s;
}
if($time >=0 && !defined('IN_MOBILE')) {
$return = '<span title="'.$s.'">'.$return.'</span>';
}
} elseif(($days = intval(($todaytimestamp - $timestamp) / 86400)) >= 0 && $days < 7) {
if($days == 0) {
$return = $lang['yday'].'&nbsp;'.gmdate($tformat, $timestamp);
} elseif($days == 1) {
$return = $lang['byday'].'&nbsp;'.gmdate($tformat, $timestamp);
} else {
$return = ($days + 1).'&nbsp;'.$lang['day'].$lang['before'];
}
if(!defined('IN_MOBILE')) {
$return = '<span title="'.$s.'">'.$return.'</span>';
}
} else {
$return = $s;
}
return $return;
} else {
return gmdate($format, $timestamp);
}
}

前面的今天在这里就不去看,主要看中间的IF判断。从中我们可以看得出,这里的判断主要分两种大的情况,然后再来依次来分小的情况来处理。

如果被保存的时间是大于今天零点(也就是今天的00:00以后被保存的),就是第一种情况。这个时候再次进行判断,如果时间差(当前时间-被保存的时间)大于3600s就以这个时间除以3600取整为多少小时前;如果是大于1800小于等于3600就是显示半小时前;如果是是大于60小于等于1800就进行除以60再取整,得到的数,久违多少分钟前,如果是大于0小于等于60就直接显示多少秒前。如果等于0,就显示刚刚。除此之外就显示原始时间。

如果被保存时间是今天以前。那么就以今天零点那个时间减去被保存的时间,然后再用这个时间去除以24*3600,得到结果后取整,如果小于7.就再次进行判断,如果这个值为0,就显示昨天,如果这个值为1,就显示前天(比如说昨天中午12点的帖子就是显示昨天),否则及显示几天前。如果这个时间大于等于七天,就显示具体的时间。

与我们的项目经理联系
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

转载请注明出处:长沙论坛制作:对Discuz时间处理函数dgmdate()的简单说明 - 微构网络
分享: