清源绿里

php中时间与时区的解决

给所里做的网站有人员动态管理的功能,就是能显示人员出差等信息,其中包含事件的时间。

我使用的是Joomlar 1.0.12,以及jcalpro 1.5.3时间管理组件。

出现的问题是,服务器时区为北京时间东八区,可当设置一个新事件开始时间为08:00之前,例如00:00,就出现错误。说function.inc.php第186行,第200行错误,mktime不支持负数结果,云云。

找到这个mktime的语句:

1
mktime($timestringArray[0],$timestringArray[1], $timestringArray[2],01,01,1970);


不管这个函数干什么用,反正错误显而易见的。因为时区设置为东八区以后,mktime的比较对象就是1970.01.01 08:00。如果这个时候mktime的参数是早于08:00,自然会出现负数结果,接着出错。

比较弱智一点的解决办法是

1
mktime($timestringArray[0]+8,$timestringArray[1], $timestringArray[2],01,01,1970);

因为所里网站只是内部使用,所以这类不通用的猪头行改法是可以接受的。如果要强悍一点,那就$timestringArray[0]+$timezone呗(jcalpro含有)

此时,两个186和200行错误消失,但是事件的起始时间却增加了8个小时。比如说明明是00:00开始的,网页却显示08:00开始。

还是这个问题。

对jcalpro结构分析,找到这个显示事件开始时间的:

1
strftime('%H:%M',mktime($timestringArray[0]+8, $timestringArray[1],$timestringArray[2],01,01,1970));

非常不好意思,strftime也是隐含时区的。也就是说,哪怕它第二个函数是0,它也会把服务器所在时间加到结果上去。这不是我们所需要的。

百度之,翻到与时区无关的函数gmdate。把代码换成:

1
gmdate('H:i',mktime($timestringArray[0]+8, $timestringArray[1],$timestringArray[2],01,01,1970));

大功告成,记录一下,以备以后查询。

文档工作很重要。

Leave a Comment