Discuz!开发之时间处理函数dgmdate()详解

使用过Discuz!的朋友都会知道Discuz!的时间能够显示成多少秒前、多少分钟前、几个小时前、几天前等等,而不是单纯的显示标准时间,这样的时间显示方式就更显得人性化了!php

那么Discuz!是如何处理这个个性化时间显示的呢,咱们来看看Discuz!时间处理函数dgmdate()函数

定义文件:spa

\source\function\function_core.phpcode

相关代码:orm

/** 
* 格式化时间 
* @param $timestamp - 时间戳 
* @param $format - dt=日期时间 d=日期 t=时间 u=个性化 其余=自定义 
* @param $timeoffset - 时区 
* @return string 
*/ 
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);
	}
}

咱们看到上面中有一大段是对于$format == 'u'的处理,也就是显示个性化时间:get

一、若是被保存的时间是大于今天零点,这个时候若是时间差大于3600s就以这个时间除以3600取整显示为多少小时前;若是是大于1800小于等于3600就是显示半小时前;若是是是大于60小于等于1800就进行除以60再取整,获得的数为多少分钟前,若是是大于0小于等于60就直接显示多少秒前。若是等于0,就显示刚刚。string

二、若是被保存时间是今天之前。主要分7天之前、昨天、前天、N天前几种状况显示。若是这个时间大于等于7天,就显示具体的时间。it