【问题标题】:why timezone_name_from_abbr fetching wrong result?为什么 timezone_name_from_abbr 获取错误的结果?
【发布时间】:2014-04-12 09:42:50
【问题描述】:

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

$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

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

提前致谢。

【问题讨论】:

  • 确保您了解这其中的含义。有许多不同的时区共享相同的偏移量,有些时区也共享相同的缩写。 timezone_name_from_abbr 只返回任何可能结果的第一个匹配项。另请参阅timezone tag wiki 中的“时区!= 偏移量”。

标签: php timezone timezone-offset


【解决方案1】:

您对 $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');

【讨论】:

  • 我将偏移量更改为5.5 并解决了。非常感谢。
猜你喜欢
  • 2011-12-25
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多