我的应用程序托管在美国。服务器时区为 GMT。现在,当人们从全球范围内访问此应用程序时,我想获取访问它的国家/地区的时区。说 - 我正在从欧洲的某个地方访问。我想获取该特定地区的时区。我希望这可以在 Java 中完成。
4 回答
您需要先将客户端 IP 地址映射到地理位置。
有很多数据库都有这些信息。
例如,查看DB-IP,这是一个数据库,其中包含 IP 地址到各种位置信息的映射信息。
您可以将数据加载到本地数据库并使用调用 IP 地址进行查询。(HttpRequest
当您使用 Java Servlets 时,您的 . 中有这个。)
数据库的商业版本(90 美元)也包含时区。
其他可能性包括使用 Web 服务,例如IP2Location。当客户端发出请求时,您将从服务请求数据。当然,这可能会很慢,并且您依赖于远程服务的可用性。
周围还有其他数据库和服务,请找到适合您需求的数据库和服务。
我没有找到一个免费的并且里面有时区信息的。当涉及到更大的国家时,一个国家的信息肯定是不够的。
您可以采取两种方法:
- 检测平台设置
- IP地理编码
方法 1 是为此使用 javascript。我使用了一个我在这里找到的模块,效果很好。我在“跳转页面”上使用了与此类似的代码,它只获取时区,然后在登录流程中重定向(将时区作为参数传递)。
<script type="text/javascript" src="/script/detect_timezone.js"></script>
<script type="text/javascript">
var tz_info = jstz.determine_timezone();
var timezone = tz_info.timezone;
var tz_id='';
if (timezone != 'undefined') {
timezone.ambiguity_check();
tz_id = timezone.olson_tz;
alert(tz_id); // olson timezone, e.g. "Europe/London", "Asia/Tokyo" etc.
}
</script>
这比搞乱 IP 地理定位要容易得多,而且由于大多数人都将他们的计算机/设备设置为他们的“正确”时区,所以大部分时间都是正确的。
我不完全确定您实际上在问什么,因为我相信您可以自己回答这个问题。
您无法直接从 http 请求中获取时区,如此处所述:
是否有另一种方法可以从 Spring MVC 中的 HttpServletRequest 对象获取用户的时区?
但是你可以通过ip地址来判断。这里提到:
您也可以使用 getTimeZoneOffset()。这里提到:
在注册中提示用户输入 gmt 或国家代码(并从中计算 gmt)似乎仍然更容易。
首先,我们必须找到客户端的时区。
然后根据时区,我们必须按如下方式获取时间:
public String getLocalTime(String timezone) {
TimeZone tz = TimeZone.getTimeZone(timezone);
Calendar localtime = new GregorianCalendar(tz);
String strLocalTime = localtime.get(Calendar.HOUR_OF_DAY) + ":"
+ localtime.get(Calendar.MINUTE) + ":" + localtime.get(Calendar.SECOND);
return strLocalTime;
}