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 得到根目录的 __FILE__ 常量
Jul 23 PHP
php与paypal整合方法
Nov 28 PHP
php中在PDO中使用事务(Transaction)
May 14 PHP
PHP的异常处理类Exception的使用及说明
Jun 13 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
PHP中数组的分组排序实例
Jun 01 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
php+html5实现无刷新图片上传教程
Jan 22 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
PHP实现判断数组是一维、二维或几维的方法
Feb 06 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
PHP4之COOKIE支持详解
2006/10/09 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
Python中使用支持向量机SVM实践
2017/12/27 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
详解flask入门模板引擎
2018/07/18 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
英国医生在线预约:Top Doctors
2019/10/30 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
如何让Java程序执行效率更高
2014/06/25 面试题
MYSQL基础面试题
2012/05/13 面试题
《明天,我们毕业》教学反思
2014/04/24 职场文书
政风行风建设责任书
2014/07/23 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
国庆节慰问信
2015/02/15 职场文书
2015年消防工作总结
2015/04/24 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
opencv读取视频并保存图像的方法
2021/06/04 Python
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android