PHP时区。为何偏差为零?

时间:2018-04-25 11:49:53

标签: php timezone

我无法弄清楚时区如何运作。为什么这个代码产生零作为输出?它不应该返回10800而不是0吗?

$myZone   = new DateTimeZone('+0300');
$utcZone  = new DateTimeZone('+0000');

$dateA = new DateTime('now', $myZone);
var_dump($utcZone->getOffset($dateA)); // 0

$dateA->setTimezone($utcZone);
var_dump($utcZone->getOffset($dateA)); // 0

$dateA->modify('+ 3600 seconds');
var_dump($utcZone->getOffset($dateA)); // 0

似乎$ utcZone-> getOffset(...)根本不关心它的参数时区和时间差异。逻辑在哪里?

2 个答案:

答案 0 :(得分:1)

<?php

$myZone   = new DateTimeZone('+0300');
$utcZone  = new DateTimeZone('+0000');

$dateA = new DateTime('now', $myZone);


$timeOffset = $myZone->getOffset($dateA);
var_dump($timeOffset);

如你所说,这个将返回10800。这是getOffset中的另一种方式。

输出为:int(10800)

答案 1 :(得分:1)

getOffset返回特定时刻时区使用的偏移量。

时区在历史记录中可以有多个偏移量 - 最常见的情况是夏令时,当偏移量在指定时间段内发生变化时。因此,根据一年中的时间,某个时区可能会有不同的偏移量。

datetime参数定义您要检查的时刻,getOffset将检查时区的历史记录并返回在该特定日期时间使用的历史记录 - 无论日期时间的时区如何是。在文档中,您可以找到一个示例:http://php.net/manual/en/datetimezone.getoffset.php#refsect1-datetimezone.getoffset-examples

也就是说,当你使用固定的偏移值,例如&#34; + 0000&#34;时,这意味着DateTimeZone对象将始终具有该偏移量 - 它永远不会改变。这就是为什么当你致电$utcZone->getOffset时,无论你传递什么日期时间参数,它总是返回零。

如果您想要日期偏移,请调用getOffset对象上的DateTime方法。