PHP时区技术疑问:为何getOffset方法返回值始终为0?
搞懂PHP时区偏移量的问题:为什么你的代码输出全是0?
嘿,我来帮你理清楚这个核心误区——你完全搞反了DateTimeZone::getOffset()的用法!
这个方法的逻辑是:传入一个DateTime对象,返回这个时间点在当前调用的时区下,相对于UTC的偏移量。你一直在用$utcZone->getOffset(...),而UTC时区本身相对于UTC的偏移量本来就是0啊,不管你传什么时间对象,结果肯定都是0,这就难怪输出全是0了!
咱们一步步拆解你的代码:
第一段代码
$myZone = new DateTimeZone('+0300'); $utcZone = new DateTimeZone('+0000'); $dateA = new DateTime('now', $myZone); var_dump($utcZone->getOffset($dateA)); // 0
这里$dateA是+0300时区的当前时间,但你问的是「这个时间在UTC时区下的偏移量」——UTC本身的偏移量就是0,所以输出0。你真正想要的应该是**+0300时区相对于UTC的偏移量**,这时候得调用$myZone->getOffset($dateA),这样才会返回10800(3×3600)。
第二段代码
$dateA->setTimezone($utcZone); var_dump($utcZone->getOffset($dateA)); // 0
现在$dateA已经被转换到UTC时区了,调用UTC时区的getOffset,结果自然还是0——因为当前时间对象就在UTC时区里,偏移量肯定是0。
第三段代码
$dateA->modify('+ 3600 seconds'); var_dump($utcZone->getOffset($dateA)); // 0
只是给UTC时间加了一小时,时间对象依然处于UTC时区,所以调用UTC的getOffset还是返回0,完全合理。
正确的用法示例
如果你想获取某个时区相对于UTC的偏移量,应该用那个时区的getOffset方法(注意是目标时区调用方法,不是UTC):
$myZone = new DateTimeZone('+0300'); $utcZone = new DateTimeZone('+0000'); $dateA = new DateTime('now', $myZone); // 获取+0300时区相对于UTC的偏移量 var_dump($myZone->getOffset($dateA)); // 输出10800
另外补充一句:有些时区会有夏令时变化,所以getOffset需要传入一个具体的时间点,这样才能返回该时区在那个时间点的准确偏移量。
内容的提问来源于stack exchange,提问作者zim32
相关产品推荐
相关产品推荐

