为什么timezone_name_from_abbr取错了结果?

时间:2014-04-12 09:42:50

标签: php timezone timezone-offset

我在将偏移量转换为时区名称时遇到了奇怪的问题 我使用follwing代码将偏移量转换为时区。

$timezoneOffset = "+05:30";
echo $timezone_name = timezone_name_from_abbr("",$timezoneOffset*3600,0);
  

输出:亚洲/卡拉奇

     

预期产量:亚洲/加尔各答

要检查偏移量,请使用

$timezone = 'Asia/Kolkata';
$time = new \DateTime('now', new DateTimeZone($timezone));
$timezoneOffset = $time->format('P');  //output:  +05:30

$timezone_name = timezone_name_from_abbr("",$timezoneOffset*3600,0);
echo $timezone_name;exit;

仍然是Asia/Karachi

的输出

那么问题是什么?我该怎么做才能解决这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您对$gmtOffset参数的计算(以GMT为单位的偏移量,以秒为单位)不正确。

在PHP中,"+05:30" * 3600会将18000作为结果。这是因为字符串转换为整数5然后相乘。这当然意味着您呼叫timezone_name_from_abbr()的偏移量为300分钟,而不是预期的330分钟,导致返回“错误”的时区名称。

如果您希望保留现有的$timezoneOffset字符串,可以使用以下内容以秒为单位转换为时区偏移量。

$timezoneOffset = "+05:30";
$offsetSeconds = DateTime::createFromFormat('P', $timezoneOffset)->format('Z');