3

我需要一个函数来返回特定位置的时区,所以我使用 Google Time Zone API

function timezoneLookup($lat, $lng){

  $url = 'https://maps.googleapis.com/maps/api/timezone/json?location='.$lat.','.$lng.'&timestamp='.time().'&sensor=false';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $output = curl_exec($ch);
  curl_close($ch);

  return $output;
}     

该函数不起作用,因为如果我返回 $url,我可以看到 GET 变量“×tamp=”被转换为“×tamp=”。

如果我在函数之外运行脚本,它就可以工作。

为什么??

- - 更新 - -

我解决了这个问题,卷曲不适用于 https://,所以我添加:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

有关更多信息,请参阅此PHP cURL 不使用 HTTPS

4

2 回答 2

3

该功能工作正常。您看到的原因×tamp=是因为&times正在转换为×. 如果您查看源代码,您将看到正确的 url(而不是在网页上查看转换后的实体)。

为什么;不需要

于 2013-10-10T18:42:19.143 回答
3

这个功能没有问题。如果您回显该 URL,您将获得乘号,因为它正在通过 html 过滤并识别 ascii 代码。这只发生在您查看它和 html 查看器(浏览器)时,如果您查看源代码,您将看到原始字符串。

为了确认通过 curl_setopt() 时不会发生这种转换,我在我的服务器上运行了您的代码并得到了预期的结果。

echo timezoneLookup(52.2023913, 33.2023913);

function timezoneLookup($lat, $lng){

  $url = 'https://maps.googleapis.com/maps/api/timezone/json?location='.$lat.','.$lng.'&timestamp='.time().'&sensor=false';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $output = curl_exec($ch);
  curl_close($ch);

  return $output;
}     

回来...

{ "dstOffset" : 3600, "rawOffset" : 7200, "status" : "OK", "timeZoneId" : "Europe/Kiev", "timeZoneName" : "Eastern European Summer Time" }

如果此代码不适合您,则可能是网络问题。尝试用另一个网页做 curl 看看会发生什么。此外,通过像这样的简单 api 调用,您可以轻松使用file_get_contents()

于 2013-10-10T18:43:46.247 回答