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 相关文章推荐
BBS(php &amp; mysql)完整版(八)
Oct 09 PHP
PHP生成带有雪花背景的验证码
Sep 28 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
yii2简单使用less代替css示例
Mar 10 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
Laravel使用模型实现like模糊查询的例子
Oct 24 PHP
php模拟实现斗地主发牌
Apr 22 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
php设计模式 Command(命令模式)
2011/06/26 PHP
JS中style属性
2006/10/11 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
python如何实现递归转非递归
2021/02/25 Python
英国在线花园中心:You Garden
2018/06/03 全球购物
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
汉语言文学职业规划
2014/02/14 职场文书
老龙头导游词
2015/02/11 职场文书
表扬信范文
2015/05/04 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
python删除csv文件的行列
2021/04/06 Python