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

admin 轻心小站 关注 LV.19 运营
发表于discuz程序版块 教程

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

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

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

定义文件:

\source\function\function_core.php

相关代码:

/**  

* 格式化时间  

* @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'的处理,也就是显示个性化时间:

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

2、如果被保存时间是今天以前。主要分7天以前、昨天、前天、N天前几种情况显示。如果这个时间大于等于7天,就显示具体的时间。

文章说明:

本文原创发布于探乎站长论坛,未经许可,禁止转载。

题图来自Unsplash,基于CC0协议

该文观点仅代表作者本人,探乎站长论坛平台仅提供信息存储空间服务。

评论列表 评论
发布评论

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

粉丝

0

关注

0

收藏

0

已有0次打赏