使用过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天,就显示具体的时间。
  演示地址:http://bbs.yuanzhumuban.cc/

Discuz!开发之时间处理函数dgmdate()详解的更多相关文章

  1. python开发笔记之zip()函数用法详解

    今天分享一篇关于python下的zip()函数用法. zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素按顺序组合成一个tuple,每个tuple中包含的是原 ...

  2. PHP用strtotime()函数比较两个时间的大小实例详解

    在PHP开发中,我们经常会对两个时间的大小进行判断,但是,在PHP中,两个时间是不可以直接进行比较,因为时间是由年.月.日.时.分.秒组成的,所以,如果需要将两个时间进行比较的话,我们首先要做的就是将 ...

  3. SQL Server数据库ROW_NUMBER()函数使用详解

    SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_ ...

  4. PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明

    PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载   中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明 ...

  5. PHP date函数参数详解

    PHP date函数参数详解 作者: 字体:[增加 减小] 类型:转载       time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计 ...

  6. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  7. SQL Server日期时间格式转换字符串详解

    本文我们主要介绍了SQL Server日期时间格式转换字符串的相关知识,并给出了大量实例对其各个参数进行对比说明,希望能够对您有所帮助. 在SQL Server数据库中,SQL Server日期时间格 ...

  8. php中setcookie函数用法详解(转)

    php中setcookie函数用法详解:        php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见.        语法:        bool set ...

  9. Python学习入门教程,字符串函数扩充详解

    因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习 ...

随机推荐

  1. [LeetCode] 415. Add Strings 字符串相加

    Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...

  2. TypeWriting

    头文件getputch.h /* * getputch.c */ /* 用于getch/putch的通用头文件"getputch.h" */ #ifndef __GETPUTCH ...

  3. x58平台 服务器电源配置 tdp

    我的机器配置: 处理器:    Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz *2主板:    TYAN Tyan Tank GT20-B7002LN ...

  4. ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便(转载)

    原文地址:https://www.cnblogs.com/Andre/p/9604759.html 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通 ...

  5. dataframe 基本操作

    package com.jason.example import org.apache.spark.sql.functions.broadcast class DFTest extends Spark ...

  6. centos7上配置mysql8的主从复制

    注意:1.主库:10.1.131.75,从库:10.1.131.762.server-id必须是纯数字,并且主从两个server-id在局域网内要唯一. [主节点]vi /etc/my.cnf[mys ...

  7. js对数组去重的方法总结-(2019-1)

    最近待业在家,系统地学习了一套js的课程.虽然工作时间真的比较长了,但有些东西只局限在知其然而不知其所以然的程度上,有些知识点通过“血和泪”的经验积累下来,也只是记了结果并没有深究,所以每次听完课都有 ...

  8. SQL Inserted 触发器游标结合实例

    SqlServer的Inserted可能是一个集合而不是一条数据,如果有如果需要对插入数据进行处理,有时需要用游标逐条处理 FROM inserted) --插入和更新 declare cur cur ...

  9. Gordon家族(二)

    本文是 Gordon家族(一) 的续集. 16. GoLearn 介绍:Gordon博士为Go开发者提供了一系列机器学习的库,开箱即用. 地址:https://github.com/sjwhitwor ...

  10. 如何将云上的Linux文件自动备份到本地服务器

    需求场景: 将云上一台Linux服务器文件备份到本地服务器,一周一备即可. 面对这样一个需求,我们可能面临下列几个问题, 备份方式:是云服务器推文件到本地服务器写入,还是本地服务器从云服务器拉文件?这 ...