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

IT技术 php javascript timezone
2021-03-14 07:38:48

我经常需要根据不同时区的用户实际本地时间或受其影响来显示信息有没有可靠的方法来获取用户的当前时间和/或时区?

关键问题:

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

关键问题:

  • 是否有必要确定用户的地理位置?
  • ISP 时间可以作为准确的指南吗?
  • 用户操作系统时钟可以改变或由用户修改?

例子:

倒数:

仅剩 1 小时 3 分 56 秒!

问题:基于什么需要几秒钟;用户的操作系统时钟、主机服务器时间(正负偏移)、ISP 系统时间。如果时钟在所有时区的同一时间结束,这很容易,但如果是用户本地时区的午夜倒计时,则更棘手)

编辑日志

下午 3:03 发布的项目(10 秒前)

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

营业时间:

这家餐厅现在营业至午夜(澳大利亚东部标准时间)。

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

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

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

6个回答

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

new Date().getTimezoneOffset() * -1

从 GMT 返回以分钟为单位的偏移量。不要存储此值,因为它会根据夏令时而改变。如果您在服务器 (php) 上需要它,那么您需要在发送时捕获它。

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

总之没有。

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

您可以根据围绕用户 IP 地址的试探法计算用户的默认时区,但这容易出错。

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

我的建议:让用户根据您期望用户所在的位置,使用合理的默认值来选择他们的时区。

在我的服务器上,我控制时间并确保它是正确的。如果您使用共享主机,时间应该是正确的,否则您应该抱怨。
2021-04-20 07:38:48
服务器端时间基于ISP或主机不同,客户端时间基于用户的系统时钟,可编辑且不准确。
2021-04-21 07:38:48
哦,和用户的ISP没有关系。
2021-04-30 07:38:48

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

通过服务器日期,您可以确定您的时间是公正的。所有计算都必须使用服务器日期完成。

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

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

PHP 有一个PECL 扩展和一个可以进行 GeoIP 查找PEAR 包假设用户不在某种代理或 NAT 后面,数据库是最新且准确的,并且地址完全在数据库中,您可以获得时区,并计算与服务器时间的偏移量.

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

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


补充:如果你的服务器时钟是准确的(如果不是,就像 HermanD 说的,如果你控制服务器就修复它,如果你不这样做就抱怨)但是不在正确的时区,你总是可以使用 PHPini_set()date_default_timezone_set()强制你的脚本无论系统时区如何,均以 GMT 运行。

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