我正在计算两个时区之间的偏移量,但我看到的结果我不希望(零)使用以下代码:
$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;
如果我翻转时区字符串,它可以工作,但上面的代码肯定也可以。发生了什么事?
答案 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;
}