php gmdate跨时区,php中时间与时区的解决

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

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

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

找到这个mktime的语句:

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

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

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

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

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

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

还是这个问题。

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

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

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

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

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

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

文档工作很重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值