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 相关文章推荐
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
PHP中读写文件实现代码
Oct 20 PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 PHP
PHP合并两个数组的两种方式的异同
Sep 14 PHP
深入php list()函数的详解
Jun 05 PHP
PHPExcel简单读取excel文件示例
May 26 PHP
php PDO异常处理详解
Nov 20 PHP
Laravel模型事件的实现原理详解
Mar 14 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
php求斐波那契数的两种实现方式【递归与递推】
Sep 09 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 09 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
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
python 解析html之BeautifulSoup
2009/07/07 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Python中安装easy_install的方法
2018/11/18 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
python实现ping命令小程序
2020/12/28 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
一篇.NET面试题
2014/09/29 面试题
资产经营总监岗位职责
2013/12/04 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
计算机实训报告总结
2014/11/05 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
Python中字符串对象语法分享
2022/02/24 Python
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python