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 相关文章推荐
ADODB类使用
Nov 25 PHP
CodeIgniter php mvc框架 中国网站
May 26 PHP
PHP 时间转换Unix时间戳代码
Jan 22 PHP
服务器web工具 php环境下
Dec 29 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
php二维码生成
Oct 19 PHP
CI配置多数据库访问的方法
Mar 28 PHP
PHP模糊查询的实现方法(推荐)
Sep 06 PHP
PHP rmdir()函数的用法总结
Jul 02 PHP
phpstudy2020搭建站点的实现示例
Oct 30 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
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
php函数式编程简单示例
2019/08/08 PHP
javascript实现的一个随机点名功能
2014/08/26 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
办公室助理岗位职责
2013/12/25 职场文书
高二生物教学反思
2014/01/27 职场文书
公司担保书范文
2014/05/21 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2015年招生工作总结
2015/05/04 职场文书
爱心捐助活动总结
2015/05/09 职场文书
闪闪红星观后感
2015/06/08 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书