确定用户的时区

Web服务器是否可以使用标准方法确定网页中用户的时区?

也许来自HTTP标头或user-agent字符串的一部分

番长古一GO2020/03/18 16:28:43

一种简单的方法是使用:

new Date().getTimezoneOffset();
Green阳光理查德2020/03/18 16:28:43

一种可能的选择是使用Date标头字段,该字段在RFC 7231中定义,并且应该包含时区。当然,不能保证该值确实是客户的时区,但这可以是一个方便的起点。

ProGil2020/03/18 16:28:43

您可以在具有time-timezone的客户端上执行此操作,然后将该值发送到服务器;样本用法:

> moment.tz.guess()
"America/Asuncion"
A蛋蛋2020/03/18 16:28:43

魔术似乎都在

visitortime.getTimezoneOffset()

太酷了,我对此一无所知。它可以在Internet Explorer等环境下工作吗?从那里,您应该能够使用JavaScript到Ajax,设置cookie,等等。我可能自己走饼干路线。

不过,您需要允许用户对其进行更改。我们曾尝试使用地理定位(通过maxmind)来进行此操作,并且这种情况经常会出错,足以使它不值得这样做,因此我们只允许用户在其个人资料中进行设置,并向那些还没有设置他们的。

前端小胖2020/03/18 16:28:43

这是一篇文章(带有源代码),解释了如何确定和使用ASP.NET(VB.NET,C#)应用程序中的本地化时间:

是时候了

简而言之,所描述的方法依赖于JavaScript getTimezoneOffset函数,该函数返回保存在会话cookie中的值,并供后台代码在GMT和本地时间之间调整时间值。令人高兴的是,用户无需指定时区(代码会自动指定时区)。涉及的内容更多(这就是我链接到本文的原因),但是提供的代码确实使它易于使用。我怀疑您可以将逻辑转换为PHP和其他语言(只要您了解ASP.NET)。

Jim飞云2020/03/18 16:28:43

如果您恰巧使用OpenID进行身份验证,则简单注册扩展将为已身份验证的用户解决问题(您需要将tz转换为数字)。

另一个选择是从用户代理的国家/地区偏好推断时区。这是一种粗略的方法(不适用于美国),但是可以很好地近似。

Sam斯丁2020/03/18 16:28:43

我仍然没有在这里看到获得时区的详细答案。您不需要按IP地址进行地理编码或使用PHP(lol)或从偏移量中错误地猜测。

首先,时区不仅仅是GMT的偏移量。这是一块由当地标准设定时间规则的土地。一些国家/地区有夏令时,并且会在不同时间开启DST。通常重要的是获取实际区域,而不仅仅是当前偏移量。

如果您打算存储该时区,例如在用户首选项中,则需要时区而不仅仅是偏移量。对于实时转换,它并不重要。

现在,要使用javascript获取时区,您可以使用以下代码:

>> new Date().toTimeString();
"15:46:04 GMT+1200 (New Zealand Standard Time)"
//Use some regular expression to extract the time.

但是,我发现简单地使用此强大的插件会更容易,该插件返回Olsen格式的时区:

https://github.com/scottwater/jquery.detect_timezone

凯Harry2020/03/18 16:28:43

不要使用IP地址来确定位置(以及时区),这是因为对于NAT,代理(越来越流行)和VPN,IP地址不一定能真实地反映用户的实际位置,而只能反映用户的实际位置。实现这些协议的服务器所在。

鉴于号码可携带性的普及,类似于美国区号不再对查找电话用户有用。

上面显示的IP地址和其他技术可用于建议用户可以调整/更正的默认值

Pro猿A2020/03/18 16:28:43

简单,只需使用JavaScript getTimezoneOffset函数即可:

-new Date().getTimezoneOffset()/60;
Green卡卡西2020/03/18 16:28:42

使用jQuery在AJAX请求上将时区偏移量提交为HTTP标头

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);
    }
});

您也可以通过做同样获得实际的时区名称的东西moment.tz.guess();http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/

Near小哥Green2020/03/18 16:28:42

这是确定浏览器所在时区的强大JavaScript解决方案。

>>> var timezone = jstz.determine();
>>> timezone.name(); 
"Europe/London"

https://bitbucket.org/pellepim/jstimezonedetect

JinJin阿飞2020/03/18 16:28:42

确定我所看到的时区的最流行(==标准?)方法只是问用户自己。如果您的网站需要订阅,则可以将其保存在用户的个人资料数据中。对于匿名用户,日期可以显示为UTC或GMT或类似的日期。

我不是想成为聪明人。只是有时候某些问题在任何编程环境之外都有更好的解决方案。

Vicky2020/03/18 16:28:42

到目前为止,还没有HTTP标头可以报告客户端时区,尽管建议将其包含在HTTP规范中。

如果是我,我可能会尝试使用客户端JavaScript获取时区,然后使用Ajax或其他方式将其提交到服务器。

樱猿2020/03/18 16:28:42

JavaScript是获取客户端本地时间的最简单方法。我建议使用XMLHttpRequest发送回本地时间,如果失败,请回退到基于其IP地址检测到的时区。

就地理位置而言,我已经在多个项目中使用了MaxMind GeoIP,并且效果很好,尽管我不确定它们是否提供时区数据。这是一项您需要付费的服务,它们每月提供数据库更新。他们提供几种Web语言的包装器。

西门达蒙2020/03/18 16:28:42
-new Date().getTimezoneOffset()/60;

该方法getTimezoneOffset()将从GMT中减去您的时间,并返回分钟数。因此,如果您住在GMT-8,它将返回480。

要将其乘以小时数,除以60。此外,请注意,该符号与您需要的符号相反-它是计算GMT与您所在时区的偏移量,而不是您所在时区与GMT的偏移量。要解决此问题,只需乘以-1。

另请注意,w3school说:

The returned value is not a constant, because of the practice of using Daylight Saving Time.