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 相关文章推荐
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
php类声明和php类使用方法示例分享
Mar 29 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
Oct 14 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
Mar 24 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
php封装的验证码类分享
Feb 26 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
Django 中 cookie的使用
Aug 17 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 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笔记之:有规律大文件的读取与写入的分析
2013/04/26 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
vue组件name的作用小结
2018/05/23 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Django 前后台的数据传递的方法
2017/08/08 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
电气专业应届生求职信
2013/11/01 职场文书
国际会议邀请函范文
2014/01/16 职场文书
财务主管岗位职责
2014/02/28 职场文书
买房协议书
2014/04/11 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
公司周年庆活动方案
2014/08/25 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
检讨书怎么写?
2019/06/21 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server