php中时间与时区的解决
给所里做的网站有人员动态管理的功能,就是能显示人员出差等信息,其中包含事件的时间。
我使用的是Joomlar 1.0.12,以及jcalpro 1.5.3时间管理组件。
出现的问题是,服务器时区为北京时间东八区,可当设置一个新事件开始时间为08:00之前,例如00:00,就出现错误。说function.inc.php第186行,第200行错误,mktime不支持负数结果,云云。
找到这个mktime的语句:
1 |
不管这个函数干什么用,反正错误显而易见的。因为时区设置为东八区以后,mktime的比较对象就是1970.01.01 08:00。如果这个时候mktime的参数是早于08:00,自然会出现负数结果,接着出错。
比较弱智一点的解决办法是
1 |
因为所里网站只是内部使用,所以这类不通用的猪头行改法是可以接受的。如果要强悍一点,那就$timestringArray[0]+$timezone呗(jcalpro含有)
此时,两个186和200行错误消失,但是事件的起始时间却增加了8个小时。比如说明明是00:00开始的,网页却显示08:00开始。
还是这个问题。
对jcalpro结构分析,找到这个显示事件开始时间的:
1 |
非常不好意思,strftime也是隐含时区的。也就是说,哪怕它第二个函数是0,它也会把服务器所在时间加到结果上去。这不是我们所需要的。
百度之,翻到与时区无关的函数gmdate。把代码换成:
大功告成,记录一下,以备以后查询。
文档工作很重要。