主要站点如何检测时区? [复制]
Posted
技术标签:
【中文标题】主要站点如何检测时区? [复制]【英文标题】:How are major sites detecting timezone? [duplicate] 【发布时间】:2011-12-03 12:25:04 【问题描述】:Facebook、myspace、MSN、craigslist;无需提交表单或重新加载页面即可检测时区并正确显示时间和日期。
他们是怎么做到的?我有一个相当大的网站,有人发布需要显示正确时间的文章(根据时区在下午 3 点或 6 点上传)。
预加载器? javascript?加载页面并重新加载?我的网站目前有该人进入该网站,并在第一次进入时重新加载页面,并通过 javascript 更新他们的时区信息。然而,这是一件很烦人的事情,我正在寻找另一种选择。我知道在加载时我可以发送一个 ajax 请求,然后让它更新整个网站的所有内容,为用户提供正确的时区但是如果我必须点击返回,或者重新加载它会询问我是否想再次发送信息这也很糟糕。那么他们是怎么做到的呢?
我在玩 Facebook,在本地机器上更改我的位置,它似乎每 5 分钟左右更新一次时区。
我是php,基于zend-framework。
【问题讨论】:
看我的回答,它更准确一点。 :) 【参考方案1】:没有“时区”请求头,或者类似的东西,所以,你不能用 php
但是使用 javascript 你可以获取客户端的时区偏移量,然后你可以发出 xmlhttp 请求将信息发送到 php
看到这个:http://www.pageloom.com/automatic-timezone-detection-with-javascript
很简单!
希望对你有帮助
【讨论】:
@AdamSack 主要网站通过注册用户的信息检测时区,他们有自己的 geoip 数据库。 in plus darius 说在它的电脑上改变时间,变化被检测到,所以他们肯定使用 javascript。 我同意 @AdamSack 仍然为 Javascript +1 ;) 时区偏移量不是恒定的,它随着夏令时而变化,因此客户端使用的时区可能不明确。 IP、js 时区偏移和 js 语言环境的组合应该会产生更好的结果(你需要一个以某种方式组合所有这些的数据库)。【参考方案2】:您可以找到用户国家/地区using IP address geocoding,然后为每个国家/地区创建一些包含时区的数组。我认为没有其他方法。 您可以像这样获取用户国家/地区:
<?php
$file = file_get_contents("http://api.hostip.info/get_html.php?ip=".$_SERVER['REMOTE_ADDR']."");
?>
然后只需将explode
用于$file
。
看看这些 *** 代码:How can I determine a web user's time zone?Any Reliable API available to determine User's city and country from IP address
【讨论】:
【参考方案3】:我相信他们使用 IP 寻址和地理位置。仅此而已。
【讨论】:
不,js ajax请求也是不错的选择【参考方案4】:首先,您应该在所有级别使用 UTC,如果您不知道时区,请标记时间。然后在本地客户端上,您可以使用 timezoneOffset 调整时间
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
【讨论】:
【参考方案5】:试试这个 php 代码,它可以提供更好的精度
<?php $ip = $_SERVER['REMOTE_ADDR'];
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
$json = json_decode($json,true);
$timezone = $json[localTimeZone];?>
【讨论】:
为什么要投反对票?我看到两个缺点,如果提供商的服务器在另一个时区,使用 IP 可能会给出错误的时区,并且使用外部站点不好,因为我们不想依赖。感谢您的意见 我没有投反对票,但我认为您列出的两个理由是不使用它的相当有说服力的理由【参考方案6】:jsTimezoneDetect 为通过 javascript 自动检测时区提供了一个很棒的库。
【讨论】:
以上是关于主要站点如何检测时区? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PHP 中将默认时区设置为用户的本地时区? [复制]