Web服务器是否可以使用标准方法确定网页中用户的时区?
也许来自HTTP标头或user-agent
字符串的一部分?
Web服务器是否可以使用标准方法确定网页中用户的时区?
也许来自HTTP标头或user-agent
字符串的一部分?
一种可能的选择是使用Date
标头字段,该字段在RFC 7231中定义,并且应该包含时区。当然,不能保证该值确实是客户的时区,但这可以是一个方便的起点。
您可以在具有time-timezone的客户端上执行此操作,然后将该值发送到服务器;样本用法:
> moment.tz.guess()
"America/Asuncion"
魔术似乎都在
visitortime.getTimezoneOffset()
太酷了,我对此一无所知。它可以在Internet Explorer等环境下工作吗?从那里,您应该能够使用JavaScript到Ajax,设置cookie,等等。我可能自己走饼干路线。
不过,您需要允许用户对其进行更改。我们曾尝试使用地理定位(通过maxmind)来进行此操作,并且这种情况经常会出错,足以使它不值得这样做,因此我们只允许用户在其个人资料中进行设置,并向那些还没有设置他们的。
这是一篇文章(带有源代码),解释了如何确定和使用ASP.NET(VB.NET,C#)应用程序中的本地化时间:
简而言之,所描述的方法依赖于JavaScript getTimezoneOffset
函数,该函数返回保存在会话cookie中的值,并供后台代码在GMT和本地时间之间调整时间值。令人高兴的是,用户无需指定时区(代码会自动指定时区)。涉及的内容更多(这就是我链接到本文的原因),但是提供的代码确实使它易于使用。我怀疑您可以将逻辑转换为PHP和其他语言(只要您了解ASP.NET)。
我仍然没有在这里看到获得时区的详细答案。您不需要按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格式的时区:
不要使用IP地址来确定位置(以及时区),这是因为对于NAT,代理(越来越流行)和VPN,IP地址不一定能真实地反映用户的实际位置,而只能反映用户的实际位置。实现这些协议的服务器所在。
鉴于号码可携带性的普及,类似于美国区号不再对查找电话用户有用。
上面显示的IP地址和其他技术可用于建议用户可以调整/更正的默认值。
简单,只需使用JavaScript getTimezoneOffset
函数即可:
-new Date().getTimezoneOffset()/60;
使用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/
这是确定浏览器所在时区的强大JavaScript解决方案。
>>> var timezone = jstz.determine();
>>> timezone.name();
"Europe/London"
确定我所看到的时区的最流行(==标准?)方法只是问用户自己。如果您的网站需要订阅,则可以将其保存在用户的个人资料数据中。对于匿名用户,日期可以显示为UTC或GMT或类似的日期。
我不是想成为聪明人。只是有时候某些问题在任何编程环境之外都有更好的解决方案。
到目前为止,还没有HTTP标头可以报告客户端时区,尽管建议将其包含在HTTP规范中。
如果是我,我可能会尝试使用客户端JavaScript获取时区,然后使用Ajax或其他方式将其提交到服务器。
JavaScript是获取客户端本地时间的最简单方法。我建议使用XMLHttpRequest发送回本地时间,如果失败,请回退到基于其IP地址检测到的时区。
就地理位置而言,我已经在多个项目中使用了MaxMind GeoIP,并且效果很好,尽管我不确定它们是否提供时区数据。这是一项您需要付费的服务,它们每月提供数据库更新。他们提供几种Web语言的包装器。
-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.
一种简单的方法是使用: