扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
使用过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'].' '.gmdate($tformat, $timestamp); } elseif($days == 1) { $return = $lang['byday'].' '.gmdate($tformat, $timestamp); } else { $return = ($days + 1).' '.$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小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流