使用JavaScript或PHP自动检测用户当前的本地时间

时间:2009-05-14 13:58:30

标签: php javascript timezone

我经常需要根据用户的实际本地时间显示信息,这些信息因时区而异。是否有可靠的方式来获取用户的当前时间和/或时区?

关键问题:

  • 服务器端代码基于网站主机或用户的ISP
  • 客户端代码基于用户的系统时钟,操作太容易操作

关键问题:

  • 是否有必要确定用户的地理位置?
  • ISP时间可以准确指导吗?
  • 用户OS时钟可能会有所不同或被用户修改?

示例:

倒计时:

  

只需1小时3分56秒!

问题:基于什么去的秒;用户的OS时钟,主机服务器时间(正负偏移),ISP系统时间。如果所有时区的时钟同时结束,这很容易,但如果它是用户当地时区的午夜倒计时,则会更加棘手)

修改日志

  

项目发布于3:03 pm(10秒前)

问题:无论用户如何计算“10秒”,调整时间以匹配用户的时区。

营业时间:

  

这家餐厅现在营业至午夜(AEST)。

问题:给出午夜等时间可以通过从服务器端偏移来计算,但是使用psudo时间(例如现在),在2小时内基于用户的时间。

PHP:使用time()输出服务器时间。这可以根据用户的时区进行偏移。

JavaScript:使用Date()输出用户的计算机时钟时间,这太容易操作了。

6 个答案:

答案 0 :(得分:12)

使用JavaScript,有一种方法可以让用户获得当前时区偏移量。

new Date().getTimezoneOffset() * -1

返回GMT的分钟偏移量。请勿存储此值,因为它可能会根据夏令时变化。如果你需要在服务器(php)上,那么你需要在发送它时捕获它。

不幸的是,HTTP规范不会将用户时区作为标头发送,这是php需要的。

答案 1 :(得分:8)

简而言之。

我建议使用服务器端时间,并且能够让用户选择他们的时区。

您可以根据IP地址周围的启发式方法计算用户的默认时区,但这是错误的。

您应该能够通过javascript / Ajax提取客户端时区信息,但与时间本身一样,这也是错误的。

我的推荐:让用户根据您期望用户的位置选择具有合理默认值的时区。

答案 2 :(得分:3)

我建议您将服务器日期写入javascript。然后在javascript中新建一个日期,以便用户在他们的机器上设置日期。使用两个日期中的不同。

使用服务器日期,您确信您的时间是公正的。 所有计算必须使用服务器日期完成。

仅用于显示目的的差异。 这适用于编辑日志,倒计时和选择“早上好”等消息。

如果用户希望他的时间成为别的东西......我想你应该让他拥有它。

答案 3 :(得分:3)

PHP有PECL extensionPEAR package可以进行GeoIP查找。假设用户不在某种代理或NAT之后,数据库是最新且准确的,并且地址完全在数据库中,您可以获得timezone,并计算偏移量从服务器时间开始。

或者,您可以接受用户的系统时钟不是100%准确,但通常非常接近。所有主流操作系统都有一些方法可以将它们的时钟与网络时间服务器同步,其中大部分都是默认打开的。如果该人决定将他们的计算机置于“错误”的时区,则可能是出于某种原因(他们正在旅行,他们与另一个时区的人一起工作)。

如果用户由于某种原因将时钟设置为10分钟,他们会接受时间计算不准确的后果。


<强>加: 如果您的服务器时钟是准确的(如果没有,就像HermanD说的那样,如果您控制服务器就修复它,如果不这样做则抱怨)但是时间不合适,您可以始终使用PHP ini_set()或{{ 1}}强制您的脚本在GMT中运行,无论系统时区如何。

答案 4 :(得分:1)

<强>的javascript:

<script type="text/javascript">
var currentTime = new Date()
var hours = currentTime.getHours()
var minutes = currentTime.getMinutes()

if (minutes < 10){
  minutes = "0" + minutes;
}
var suffix = "AM";
if (hours >= 12) {
suffix = "PM";
hours = hours - 12;
}
if (hours == 0) {
hours = 12;
}

document.write("<b>" + hours + ":" + minutes + " " + suffix + "</b>");
</script>

输出

上午11:51

答案 5 :(得分:0)

我建议使用服务器时间。例如,time()函数。如果您将一切都基于此值,那么您的系统将是您所需的任何特定操作的安全。

每当用户请求具有或使用时间限制的页面时,请确保您发送服务器时间。

创建一个Javascript模块,在页面加载时,检查服务器是否已发送时间,如果是,则读取该值,并使用JS获取或计算的时区将其转换为JS本地时间。然后你可以把它保存为JS全局或者将它作为对象中的静态var来抨击。