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

   

使用过Discuz!的朋友都会知道Discuz!的时间可以显示成多少秒前、多少分钟前、几个小时前、几天前等等,而不是单纯的显示标准时间,这样的时间显示方式就更显得人性化了!
 
那么Discuz!是如何处理这个个性化时间显示的呢,我们来看看Discuz!时间处理函数dgmdate()
 
定义文件:
  
1
\source\function\function_core.php

  相关代码:

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/** 
* 格式化时间 
* @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天,就显示具体的时间。
  演示地址:http://bbs.yuanzhumuban.cc/
posted @   圆柱模板  阅读(741)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-09-27 帝国CMS熊掌号数据主动推送插件【原创】
点击右上角即可分享
微信分享提示