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访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
PHP操作MySQL事务实例
Nov 05 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
Oct 18 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
PHP获取链表中倒数第K个节点的方法
Jan 18 PHP
php写入文件不覆盖的实例讲解
Sep 17 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 PHP
如何在Mac上通过docker配置PHP开发环境
May 29 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中检查文件或目录是否存在的代码小结
2012/10/22 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
jQuery 性能优化指南 (1)
2009/05/21 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
python Celery定时任务的示例
2018/03/13 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
python编写简单端口扫描器
2019/09/04 Python
django model通过字典更新数据实例
2020/04/01 Python
python3的pip路径在哪
2020/06/23 Python
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
简历自我评价怎么写呢?
2014/01/06 职场文书
毕业生自荐书
2014/02/02 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
《雪儿》教学反思
2014/04/17 职场文书
消防工作实施方案
2014/06/09 职场文书
师德师风事迹材料
2014/12/20 职场文书
酒桌上的祝酒词
2015/08/12 职场文书