php的日期处理函数及uchome的function_coomon中日期处理函数的研究


Posted in PHP onJanuary 12, 2011
<?php echo time(); 
echo mktime(11,25,0,9,5,2010);//和time一样的 
echo microtime(); 
echo mktime(0,0,0,1,1,1970); 
?>

这里面输出分别是1283657290、1283657100、0.88533200 1283657290、-25200。从最后一个值看,我们知道这里返回的时间戳是经过了时区调整的,也就是我在中国的1970年1月1日0点,格林尼治还没有到0点呢,于是这里的时间会是负数且整好等于-8*3600。

再看

<?php 
echo date ("H i l d F" ,1283657100); 
echo gmdate("H i l d F",1283657100); 
echo strftime("%Hh%M %A %d %b" ,1283657100); 
//strftime()工作的方式和date()没有什么不同,除了特殊格式化字符的前面必须添加一个百分号%。 
echo strtotime("2010-9-5 11:25:00"); 
var_dump(getdate (time())); 
?>

这里的输出是11 25 Sunday 05 September、03 25 Sunday 05 September、11h25 Sunday 05 Sep、1283657100、array(11) {
["seconds"]=>
int(9)
["minutes"]=>
int(39)
["hours"]=>
int(11)
["mday"]=>
int(5)
["wday"]=>
int(0)
["mon"]=>
int(9)
["year"]=>
int(2010)
["yday"]=>
int(247)
["weekday"]=>
string(6) "Sunday"
["month"]=>
string(9) "September"
[0]=>
int(1283657949)
}

主要看第三个输出,这里输出的是在中国的2010年9月5日11点25分的时候 格林尼治的时间是多少。这里也要计入时差的。而且这里还有一个很奇妙的就是只有gmdate没有发出警告,其余的都有警告说不能依赖于系统的时区。想象也是,因为gmdate算出来的只是格林尼治的时间,就算是系统时区错了,一加一减就又正常了。

//时间格式化 
function sgmdate($dateformat, $timestamp='', $format=0) { 
global $_SCONFIG, $_SGLOBAL; 
if(empty($timestamp)) { 
$timestamp = $_SGLOBAL['timestamp']; 
} 
$timeoffset = strlen($_SGLOBAL['member']['timeoffset'])>0?intval($_SGLOBAL['member']['timeoffset']):intval($_SCONFIG['timeoffset']); 
$result = ''; 
if($format) { 
$time = $_SGLOBAL['timestamp'] - $timestamp; 
if($time > 24*3600) { 
$result = gmdate($dateformat, $timestamp + $timeoffset * 3600); 
} elseif ($time > 3600) { 
$result = intval($time/3600).lang('hour').lang('before'); 
} elseif ($time > 60) { 
$result = intval($time/60).lang('minute').lang('before'); 
} elseif ($time > 0) { 
$result = $time.lang('second').lang('before'); 
} else { 
$result = lang('now'); 
} 
} else { 
$result = gmdate($dateformat, $timestamp + $timeoffset * 3600); 
} 
return $result; 
}

我们直接看if($format){}里的东西,首先求得系统当前时间和我传进来的时间(一般是数据库里的时间,如2010-9-4 21:00:00)的差。如果时间差是在一天以内,则直接得出结论比如两小时前,如果是大于1天,则调用gmdate。这里我就是很搞不懂的。为什么要调用这个诡异的函数,而不是直接date($timestamp)呢?这他妈的到底是什么意思阿?
gmdate

When run in Finland (GMT +0200), the first line below prints "Jan 01 1998 00:00:00", while the second prints "Dec 31 1997 22:00:00".

<?php 
echo date("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998)); 
echo gmdate("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998)); 
?>

也就是说gmdate是考虑过了时差的。这里会输出标准的时间格式,而不是几天前。
接下来着重看uchome的function_common里的函数
//字符串时间化 
function sstrtotime($string) { 
global $_SGLOBAL, $_SCONFIG; 
$time = ''; 
if($string) { 
$time = strtotime($string); 
if(gmdate('H:i', $_SGLOBAL['timestamp'] + $_SCONFIG['timeoffset'] * 3600) != date('H:i', $_SGLOBAL['timestamp'])) { 
$time = $time - $_SCONFIG['timeoffset'] * 3600; 
} 
} 
return $time; 
}

别看这个函数很少,但是看得我很吃力。这里是要把一个时间字符串转换为时间戳。比如我这里输入的是2010 9 4 21:08,则$time的值就是这个时间到January 1 1970 00:00:00 GMT的时间差,这里是要考虑什么时差的。$_SGLOBAL[''timestamp]的值其实和$time一样的方法算出来的,但是数值可能有细小的差别。$_SCONFIG['timeoffset']是在config的那个表里面的,目前其值为8。这里有一种情况是系统的时区是对的,或者是不对的,需要通过$_SCONFIG['timeoffset']来检验。gmdate将传入的时间戳(运行程序的地方的时间戳)经过系统的时区来得到此时格林尼治那个地方的时间。如果是系统时区设对了,那么这个正好一加一减,和后面的相等了(其实这里$_SGLOBAL[''timestamp]的数值是无关紧要的)。如果是正常的,那么就不需要改$time,如果是不正常的,那么需要减一下。但是还是那句话,这他妈的到底是什么意思阿?
PHP 相关文章推荐
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
php 字符串压缩方法比较示例
Jan 23 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
PHP中的正则表达式实例详解
Apr 25 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
Jul 24 PHP
Laravel框架集合用法实例浅析
May 14 PHP
PHP日期处理函数 整型日期格式
Jan 12 #PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 #PHP
DEDE采集大师官方留后门的删除办法
Jan 08 #PHP
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 #PHP
PHP备份/还原MySQL数据库的代码
Jan 06 #PHP
php循环检测目录是否存在并创建(循环创建目录)
Jan 06 #PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
Jan 06 #PHP
You might like
Adodb的十个实例(清晰版)
2006/12/31 PHP
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
django Serializer序列化使用方法详解
2018/10/16 Python
python将list转为matrix的方法
2018/12/12 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
python实现视频读取和转化图片
2019/12/10 Python
浅析Python3 pip换源问题
2020/01/06 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
一道Delphi面试题
2016/10/28 面试题
银行内勤岗位职责
2014/04/09 职场文书
保护环境倡议书
2014/04/14 职场文书
计划生育宣传标语
2014/06/21 职场文书
python基于turtle绘制几何图形
2021/06/15 Python
Node与Python 双向通信的实现代码
2021/07/16 Javascript
CentOS安装Nginx并部署vue
2022/04/12 Servers