PHP:为什么这段代码错误地返回零?

时间:2011-01-23 21:24:18

标签: php datetime timezone

我正在计算两个时区之间的偏移量,但我看到的结果我不希望(零)使用以下代码:

$datetimezone_london = new DateTimeZone('Europe/London');  
$datetimezone_client = new DateTimeZone('Australia/Canberra');  
$now_client = new DateTime("now", $datetimezone_client);  
$offset = $datetimezone_london->getOffset($now_client);  
echo $offset;

如果我翻转时区字符串,它可以工作,但上面的代码肯定也可以。发生了什么事?

2 个答案:

答案 0 :(得分:2)

getOffset() returns the offset to GMT秒,伦敦目前正在GMT,因此返回值为零。

我相信你需要的是:

$tz_london = new DateTimeZone('Europe/London');  
$tz_client = new DateTimeZone('Australia/Canberra');
$time_london = new DateTime('now', $tz_london);  
$time_client = new DateTime('now', $tz_client);
$offset = $time_client->getOffset() - $time_london->getOffset();  
echo $offset;

目前(1月份)返回39600(11小时)。在7月,它返回9个小时,而在10月中旬(欧洲和澳大利亚都在白天节省的时间很短),它将返回10个小时。

答案 1 :(得分:1)

DateTimeZone::getOffset()的工作方式与大多数人的想法不同。它计算作为参数传递的日期的实例DateTimeZone偏移量与GMT的偏移量。然后将作为参数传递的日期转换为与实例相同的时区(DST和其他规则应用),并计算该日期的偏移量。

因此,您的代码现在计算时区Europe/London的GMT偏移量。由于Europe/London目前正在GMT(相对于BMT),您将获得0.(尝试8月份的日期) ,你会得到36000)。

如果您想要两个时区之间的当前差异,请使用此代码......

function timezone_diff($origin, $compareTo, $forDate = "now") {
    $dtzOrigin = new DateTimeZone($origin);
    $dtzCompareTo = new DateTimeZone($compareTo);

    $compareDate = new DateTime($forDate);

    $offsetOrigin = $dtzOrigin->getOffset($compareDate);
    $offsetCompareTo = $dtzCompareTo->getOffset($compareDate);

    return $offsetCompareTo - $offsetOrigin;
}